Reformat all files with isort and black

This commit is contained in:
Diederik van der Boor
2019-07-15 09:50:03 +02:00
parent d314dce4a2
commit 59c020ee50
50 changed files with 4069 additions and 2419 deletions
+20 -21
View File
@@ -8,31 +8,30 @@ For every child type, there is an :class:`PolymorphicFormSetChild` instance
that describes how to display and construct the child.
It's parameters are very similar to the parent's factory method.
"""
from .models import (
BasePolymorphicModelFormSet,
BasePolymorphicInlineFormSet,
PolymorphicFormSetChild,
UnsupportedChildType,
polymorphic_modelformset_factory,
polymorphic_inlineformset_factory,
polymorphic_child_forms_factory,
)
from .generic import (
# Can import generic here, as polymorphic already depends on the 'contenttypes' app.
from .generic import ( # Can import generic here, as polymorphic already depends on the 'contenttypes' app.
BaseGenericPolymorphicInlineFormSet,
GenericPolymorphicFormSetChild,
generic_polymorphic_inlineformset_factory,
)
from .models import (
BasePolymorphicInlineFormSet,
BasePolymorphicModelFormSet,
PolymorphicFormSetChild,
UnsupportedChildType,
polymorphic_child_forms_factory,
polymorphic_inlineformset_factory,
polymorphic_modelformset_factory,
)
__all__ = (
'BasePolymorphicModelFormSet',
'BasePolymorphicInlineFormSet',
'PolymorphicFormSetChild',
'UnsupportedChildType',
'polymorphic_modelformset_factory',
'polymorphic_inlineformset_factory',
'polymorphic_child_forms_factory',
'BaseGenericPolymorphicInlineFormSet',
'GenericPolymorphicFormSetChild',
'generic_polymorphic_inlineformset_factory',
"BasePolymorphicModelFormSet",
"BasePolymorphicInlineFormSet",
"PolymorphicFormSetChild",
"UnsupportedChildType",
"polymorphic_modelformset_factory",
"polymorphic_inlineformset_factory",
"polymorphic_child_forms_factory",
"BaseGenericPolymorphicInlineFormSet",
"GenericPolymorphicFormSetChild",
"generic_polymorphic_inlineformset_factory",
)
+67 -39
View File
@@ -1,9 +1,16 @@
from django.contrib.contenttypes.forms import BaseGenericInlineFormSet, generic_inlineformset_factory
from django.contrib.contenttypes.forms import (
BaseGenericInlineFormSet,
generic_inlineformset_factory,
)
from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.forms.models import ModelForm
from .models import BasePolymorphicModelFormSet, polymorphic_child_forms_factory, PolymorphicFormSetChild
from .models import (
BasePolymorphicModelFormSet,
PolymorphicFormSetChild,
polymorphic_child_forms_factory,
)
class GenericPolymorphicFormSetChild(PolymorphicFormSetChild):
@@ -12,8 +19,8 @@ class GenericPolymorphicFormSetChild(PolymorphicFormSetChild):
"""
def __init__(self, *args, **kwargs):
self.ct_field = kwargs.pop('ct_field', 'content_type')
self.fk_field = kwargs.pop('fk_field', 'object_id')
self.ct_field = kwargs.pop("ct_field", "content_type")
self.fk_field = kwargs.pop("fk_field", "object_id")
super(GenericPolymorphicFormSetChild, self).__init__(*args, **kwargs)
def get_form(self, ct_field="content_type", fk_field="object_id", **kwargs):
@@ -21,7 +28,7 @@ class GenericPolymorphicFormSetChild(PolymorphicFormSetChild):
Construct the form class for the formset child.
"""
exclude = list(self.exclude)
extra_exclude = kwargs.pop('extra_exclude', None)
extra_exclude = kwargs.pop("extra_exclude", None)
if extra_exclude:
exclude += list(extra_exclude)
@@ -31,33 +38,52 @@ class GenericPolymorphicFormSetChild(PolymorphicFormSetChild):
opts = self.model._meta
ct_field = opts.get_field(self.ct_field)
if not isinstance(ct_field, models.ForeignKey) or ct_field.remote_field.model != ContentType:
raise Exception("fk_name '%s' is not a ForeignKey to ContentType" % ct_field)
if (
not isinstance(ct_field, models.ForeignKey)
or ct_field.remote_field.model != ContentType
):
raise Exception(
"fk_name '%s' is not a ForeignKey to ContentType" % ct_field
)
fk_field = opts.get_field(self.fk_field) # let the exception propagate
exclude.extend([ct_field.name, fk_field.name])
kwargs['exclude'] = exclude
kwargs["exclude"] = exclude
return super(GenericPolymorphicFormSetChild, self).get_form(**kwargs)
class BaseGenericPolymorphicInlineFormSet(BaseGenericInlineFormSet, BasePolymorphicModelFormSet):
class BaseGenericPolymorphicInlineFormSet(
BaseGenericInlineFormSet, BasePolymorphicModelFormSet
):
"""
Polymorphic formset variation for inline generic formsets
"""
def generic_polymorphic_inlineformset_factory(model, formset_children, form=ModelForm,
formset=BaseGenericPolymorphicInlineFormSet,
ct_field="content_type", fk_field="object_id",
# Base form
# TODO: should these fields be removed in favor of creating
# the base form as a formset child too?
fields=None, exclude=None,
extra=1, can_order=False, can_delete=True,
max_num=None, formfield_callback=None,
validate_max=False, for_concrete_model=True,
min_num=None, validate_min=False, child_form_kwargs=None):
def generic_polymorphic_inlineformset_factory(
model,
formset_children,
form=ModelForm,
formset=BaseGenericPolymorphicInlineFormSet,
ct_field="content_type",
fk_field="object_id",
# Base form
# TODO: should these fields be removed in favor of creating
# the base form as a formset child too?
fields=None,
exclude=None,
extra=1,
can_order=False,
can_delete=True,
max_num=None,
formfield_callback=None,
validate_max=False,
for_concrete_model=True,
min_num=None,
validate_min=False,
child_form_kwargs=None,
):
"""
Construct the class for a generic inline polymorphic formset.
@@ -70,22 +96,22 @@ def generic_polymorphic_inlineformset_factory(model, formset_children, form=Mode
:rtype: type
"""
kwargs = {
'model': model,
'form': form,
'formfield_callback': formfield_callback,
'formset': formset,
'ct_field': ct_field,
'fk_field': fk_field,
'extra': extra,
'can_delete': can_delete,
'can_order': can_order,
'fields': fields,
'exclude': exclude,
'min_num': min_num,
'max_num': max_num,
'validate_min': validate_min,
'validate_max': validate_max,
'for_concrete_model': for_concrete_model,
"model": model,
"form": form,
"formfield_callback": formfield_callback,
"formset": formset,
"ct_field": ct_field,
"fk_field": fk_field,
"extra": extra,
"can_delete": can_delete,
"can_order": can_order,
"fields": fields,
"exclude": exclude,
"min_num": min_num,
"max_num": max_num,
"validate_min": validate_min,
"validate_max": validate_max,
"for_concrete_model": for_concrete_model,
# 'localized_fields': localized_fields,
# 'labels': labels,
# 'help_texts': help_texts,
@@ -97,12 +123,14 @@ def generic_polymorphic_inlineformset_factory(model, formset_children, form=Mode
child_kwargs = {
# 'exclude': exclude,
'ct_field': ct_field,
'fk_field': fk_field,
"ct_field": ct_field,
"fk_field": fk_field,
}
if child_form_kwargs:
child_kwargs.update(child_form_kwargs)
FormSet = generic_inlineformset_factory(**kwargs)
FormSet.child_forms = polymorphic_child_forms_factory(formset_children, **child_kwargs)
FormSet.child_forms = polymorphic_child_forms_factory(
formset_children, **child_kwargs
)
return FormSet
+178 -105
View File
@@ -3,10 +3,18 @@ from collections import OrderedDict
from django import forms
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ImproperlyConfigured, ValidationError
from django.forms.models import ModelForm, BaseModelFormSet, BaseInlineFormSet, modelform_factory, modelformset_factory, inlineformset_factory
from django.forms.models import (
BaseInlineFormSet,
BaseModelFormSet,
ModelForm,
inlineformset_factory,
modelform_factory,
modelformset_factory,
)
from django.utils.functional import cached_property
from polymorphic.models import PolymorphicModel
from .utils import add_media
@@ -20,9 +28,19 @@ class PolymorphicFormSetChild(object):
Provide this information in the :func:'polymorphic_inlineformset_factory' construction.
"""
def __init__(self, model, form=ModelForm, fields=None, exclude=None,
formfield_callback=None, widgets=None, localized_fields=None,
labels=None, help_texts=None, error_messages=None):
def __init__(
self,
model,
form=ModelForm,
fields=None,
exclude=None,
formfield_callback=None,
widgets=None,
localized_fields=None,
labels=None,
help_texts=None,
error_messages=None,
):
self.model = model
@@ -59,20 +77,20 @@ class PolymorphicFormSetChild(object):
# we allow to define things like 'extra_...' fields that are amended to the current child settings.
exclude = list(self.exclude)
extra_exclude = kwargs.pop('extra_exclude', None)
extra_exclude = kwargs.pop("extra_exclude", None)
if extra_exclude:
exclude += list(extra_exclude)
defaults = {
'form': self._form_base,
'formfield_callback': self.formfield_callback,
'fields': self.fields,
'exclude': exclude,
"form": self._form_base,
"formfield_callback": self.formfield_callback,
"fields": self.fields,
"exclude": exclude,
# 'for_concrete_model': for_concrete_model,
'localized_fields': self.localized_fields,
'labels': self.labels,
'help_texts': self.help_texts,
'error_messages': self.error_messages,
"localized_fields": self.localized_fields,
"labels": self.labels,
"help_texts": self.help_texts,
"error_messages": self.error_messages,
# 'field_classes': field_classes,
}
defaults.update(kwargs)
@@ -125,61 +143,71 @@ class BasePolymorphicModelFormSet(BaseModelFormSet):
pk_field = self.model._meta.pk
to_python = self._get_to_python(pk_field)
pk = to_python(pk)
kwargs['instance'] = self._existing_object(pk)
if i < self.initial_form_count() and 'instance' not in kwargs:
kwargs['instance'] = self.get_queryset()[i]
kwargs["instance"] = self._existing_object(pk)
if i < self.initial_form_count() and "instance" not in kwargs:
kwargs["instance"] = self.get_queryset()[i]
if i >= self.initial_form_count() and self.initial_extra:
# Set initial values for extra forms
try:
kwargs['initial'] = self.initial_extra[i - self.initial_form_count()]
kwargs["initial"] = self.initial_extra[i - self.initial_form_count()]
except IndexError:
pass
# BaseFormSet logic, with custom formset_class
defaults = {
'auto_id': self.auto_id,
'prefix': self.add_prefix(i),
'error_class': self.error_class,
"auto_id": self.auto_id,
"prefix": self.add_prefix(i),
"error_class": self.error_class,
}
if self.is_bound:
defaults['data'] = self.data
defaults['files'] = self.files
if self.initial and 'initial' not in kwargs:
defaults["data"] = self.data
defaults["files"] = self.files
if self.initial and "initial" not in kwargs:
try:
defaults['initial'] = self.initial[i]
defaults["initial"] = self.initial[i]
except IndexError:
pass
# Allow extra forms to be empty, unless they're part of
# the minimum forms.
if i >= self.initial_form_count() and i >= self.min_num:
defaults['empty_permitted'] = True
defaults['use_required_attribute'] = False
defaults["empty_permitted"] = True
defaults["use_required_attribute"] = False
defaults.update(kwargs)
# Need to find the model that will be displayed in this form.
# Hence, peeking in the self.queryset_data beforehand.
if self.is_bound:
if 'instance' in defaults:
if "instance" in defaults:
# Object is already bound to a model, won't change the content type
model = defaults['instance'].get_real_instance_class() # allow proxy models
model = defaults[
"instance"
].get_real_instance_class() # allow proxy models
else:
# Extra or empty form, use the provided type.
# Note this completely tru
prefix = defaults['prefix']
prefix = defaults["prefix"]
try:
ct_id = int(self.data["{0}-polymorphic_ctype".format(prefix)])
except (KeyError, ValueError):
raise ValidationError("Formset row {0} has no 'polymorphic_ctype' defined!".format(prefix))
raise ValidationError(
"Formset row {0} has no 'polymorphic_ctype' defined!".format(
prefix
)
)
model = ContentType.objects.get_for_id(ct_id).model_class()
if model not in self.child_forms:
# Perform basic validation, as we skip the ChoiceField here.
raise UnsupportedChildType("Child model type {0} is not part of the formset".format(model))
raise UnsupportedChildType(
"Child model type {0} is not part of the formset".format(model)
)
else:
if 'instance' in defaults:
model = defaults['instance'].get_real_instance_class() # allow proxy models
elif 'polymorphic_ctype' in defaults.get('initial', {}):
model = defaults['initial']['polymorphic_ctype'].model_class()
if "instance" in defaults:
model = defaults[
"instance"
].get_real_instance_class() # allow proxy models
elif "polymorphic_ctype" in defaults.get("initial", {}):
model = defaults["initial"]["polymorphic_ctype"].model_class()
elif i < len(self.queryset_data):
model = self.queryset_data[i].__class__
else:
@@ -196,9 +224,13 @@ class BasePolymorphicModelFormSet(BaseModelFormSet):
def add_fields(self, form, index):
"""Add a hidden field for the content type."""
ct = ContentType.objects.get_for_model(form._meta.model, for_concrete_model=False)
ct = ContentType.objects.get_for_model(
form._meta.model, for_concrete_model=False
)
choices = [(ct.pk, ct)] # Single choice, existing forms can't change the value.
form.fields['polymorphic_ctype'] = forms.ChoiceField(choices=choices, initial=ct.pk, required=False, widget=forms.HiddenInput)
form.fields["polymorphic_ctype"] = forms.ChoiceField(
choices=choices, initial=ct.pk, required=False, widget=forms.HiddenInput
)
super(BasePolymorphicModelFormSet, self).add_fields(form, index)
def get_form_class(self, model):
@@ -206,7 +238,9 @@ class BasePolymorphicModelFormSet(BaseModelFormSet):
Return the proper form class for the given model.
"""
if not self.child_forms:
raise ImproperlyConfigured("No 'child_forms' defined in {0}".format(self.__class__.__name__))
raise ImproperlyConfigured(
"No 'child_forms' defined in {0}".format(self.__class__.__name__)
)
if not issubclass(model, PolymorphicModel):
raise TypeError("Expect polymorphic model type, not {0}".format(model))
@@ -218,7 +252,8 @@ class BasePolymorphicModelFormSet(BaseModelFormSet):
"The '{0}' found a '{1}' model in the queryset, "
"but no form class is registered to display it.".format(
self.__class__.__name__, model.__name__
))
)
)
def is_multipart(self):
"""
@@ -247,7 +282,7 @@ class BasePolymorphicModelFormSet(BaseModelFormSet):
form = form_class(
auto_id=self.auto_id,
prefix=self.add_prefix('__prefix__'),
prefix=self.add_prefix("__prefix__"),
empty_permitted=True,
use_required_attribute=False,
**kwargs
@@ -259,20 +294,37 @@ class BasePolymorphicModelFormSet(BaseModelFormSet):
@property
def empty_form(self):
# TODO: make an exception when can_add_base is defined?
raise RuntimeError("'empty_form' is not used in polymorphic formsets, use 'empty_forms' instead.")
raise RuntimeError(
"'empty_form' is not used in polymorphic formsets, use 'empty_forms' instead."
)
def polymorphic_modelformset_factory(model, formset_children,
formset=BasePolymorphicModelFormSet,
# Base field
# TODO: should these fields be removed in favor of creating
# the base form as a formset child too?
form=ModelForm,
fields=None, exclude=None, extra=1, can_order=False,
can_delete=True, max_num=None, formfield_callback=None,
widgets=None, validate_max=False, localized_fields=None,
labels=None, help_texts=None, error_messages=None,
min_num=None, validate_min=False, field_classes=None, child_form_kwargs=None):
def polymorphic_modelformset_factory(
model,
formset_children,
formset=BasePolymorphicModelFormSet,
# Base field
# TODO: should these fields be removed in favor of creating
# the base form as a formset child too?
form=ModelForm,
fields=None,
exclude=None,
extra=1,
can_order=False,
can_delete=True,
max_num=None,
formfield_callback=None,
widgets=None,
validate_max=False,
localized_fields=None,
labels=None,
help_texts=None,
error_messages=None,
min_num=None,
validate_min=False,
field_classes=None,
child_form_kwargs=None,
):
"""
Construct the class for an polymorphic model formset.
@@ -285,25 +337,25 @@ def polymorphic_modelformset_factory(model, formset_children,
:rtype: type
"""
kwargs = {
'model': model,
'form': form,
'formfield_callback': formfield_callback,
'formset': formset,
'extra': extra,
'can_delete': can_delete,
'can_order': can_order,
'fields': fields,
'exclude': exclude,
'min_num': min_num,
'max_num': max_num,
'widgets': widgets,
'validate_min': validate_min,
'validate_max': validate_max,
'localized_fields': localized_fields,
'labels': labels,
'help_texts': help_texts,
'error_messages': error_messages,
'field_classes': field_classes,
"model": model,
"form": form,
"formfield_callback": formfield_callback,
"formset": formset,
"extra": extra,
"can_delete": can_delete,
"can_order": can_order,
"fields": fields,
"exclude": exclude,
"min_num": min_num,
"max_num": max_num,
"widgets": widgets,
"validate_min": validate_min,
"validate_max": validate_max,
"localized_fields": localized_fields,
"labels": labels,
"help_texts": help_texts,
"error_messages": error_messages,
"field_classes": field_classes,
}
FormSet = modelformset_factory(**kwargs)
@@ -313,7 +365,9 @@ def polymorphic_modelformset_factory(model, formset_children,
if child_form_kwargs:
child_kwargs.update(child_form_kwargs)
FormSet.child_forms = polymorphic_child_forms_factory(formset_children, **child_kwargs)
FormSet.child_forms = polymorphic_child_forms_factory(
formset_children, **child_kwargs
)
return FormSet
@@ -326,17 +380,34 @@ class BasePolymorphicInlineFormSet(BaseInlineFormSet, BasePolymorphicModelFormSe
return super(BasePolymorphicInlineFormSet, self)._construct_form(i, **kwargs)
def polymorphic_inlineformset_factory(parent_model, model, formset_children,
formset=BasePolymorphicInlineFormSet, fk_name=None,
# Base field
# TODO: should these fields be removed in favor of creating
# the base form as a formset child too?
form=ModelForm,
fields=None, exclude=None, extra=1, can_order=False,
can_delete=True, max_num=None, formfield_callback=None,
widgets=None, validate_max=False, localized_fields=None,
labels=None, help_texts=None, error_messages=None,
min_num=None, validate_min=False, field_classes=None, child_form_kwargs=None):
def polymorphic_inlineformset_factory(
parent_model,
model,
formset_children,
formset=BasePolymorphicInlineFormSet,
fk_name=None,
# Base field
# TODO: should these fields be removed in favor of creating
# the base form as a formset child too?
form=ModelForm,
fields=None,
exclude=None,
extra=1,
can_order=False,
can_delete=True,
max_num=None,
formfield_callback=None,
widgets=None,
validate_max=False,
localized_fields=None,
labels=None,
help_texts=None,
error_messages=None,
min_num=None,
validate_min=False,
field_classes=None,
child_form_kwargs=None,
):
"""
Construct the class for an inline polymorphic formset.
@@ -349,27 +420,27 @@ def polymorphic_inlineformset_factory(parent_model, model, formset_children,
:rtype: type
"""
kwargs = {
'parent_model': parent_model,
'model': model,
'form': form,
'formfield_callback': formfield_callback,
'formset': formset,
'fk_name': fk_name,
'extra': extra,
'can_delete': can_delete,
'can_order': can_order,
'fields': fields,
'exclude': exclude,
'min_num': min_num,
'max_num': max_num,
'widgets': widgets,
'validate_min': validate_min,
'validate_max': validate_max,
'localized_fields': localized_fields,
'labels': labels,
'help_texts': help_texts,
'error_messages': error_messages,
'field_classes': field_classes,
"parent_model": parent_model,
"model": model,
"form": form,
"formfield_callback": formfield_callback,
"formset": formset,
"fk_name": fk_name,
"extra": extra,
"can_delete": can_delete,
"can_order": can_order,
"fields": fields,
"exclude": exclude,
"min_num": min_num,
"max_num": max_num,
"widgets": widgets,
"validate_min": validate_min,
"validate_max": validate_max,
"localized_fields": localized_fields,
"labels": labels,
"help_texts": help_texts,
"error_messages": error_messages,
"field_classes": field_classes,
}
FormSet = inlineformset_factory(**kwargs)
@@ -379,5 +450,7 @@ def polymorphic_inlineformset_factory(parent_model, model, formset_children,
if child_form_kwargs:
child_kwargs.update(child_form_kwargs)
FormSet.child_forms = polymorphic_child_forms_factory(formset_children, **child_kwargs)
FormSet.child_forms = polymorphic_child_forms_factory(
formset_children, **child_kwargs
)
return FormSet