Source code for shuup.admin.form_modifier
# -*- coding: utf-8 -*-
# This file is part of Shuup.
#
# Copyright (c) 2012-2021, Shuup Commerce Inc. All rights reserved.
#
# This source code is licensed under the OSL-3.0 license found in the
# LICENSE file in the root directory of this source tree.
import abc
import six
from django.contrib import messages
from django.db.transaction import atomic
from shuup.apps.provides import get_provide_objects
from shuup.utils.excs import Problem
[docs]class FormModifier(six.with_metaclass(abc.ABCMeta)):
[docs] def get_extra_fields(self, object=None):
"""
Extra fields for creation view.
:param object: Object linked to form.
:type object: django.db.models.Model
:return: List of extra fields that should be added to form.
Tuple should contain field name and Django form field.
:rtype: list[(str,django.forms.Field)]
"""
pass
[docs] def clean_hook(self, form):
"""
Extra clean for creation form.
This hook will be called in `~Django.forms.Form.clean` method of
the form, after calling parent clean. Implementor of this hook
may call `~Django.forms.Form.add_error` to add errors to form or
modify the ``form.cleaned_data`` dictionary.
:param form: Form that is currently cleaned.
:type form: django.forms.Form
:rtype: None
"""
pass
[docs] def form_valid_hook(self, form, object):
"""
Extra form valid handler for creation view.
:param form: Form that is currently handled.
:type form: django.forms.Form
:param object: object linked to form.
:type object: django.db.models.Model
:rtype: None
"""
pass
[docs]class ModifiableFormMixin(object):
form_modifier_provide_key = None
[docs] def clean(self):
cleaned_data = super(ModifiableFormMixin, self).clean()
for extend_class in get_provide_objects(self.form_modifier_provide_key):
extend_class().clean_hook(self)
return cleaned_data
[docs]class ModifiableViewMixin(object):
[docs] def add_extra_fields(self, form, object=None):
for extend_class in get_provide_objects(form.form_modifier_provide_key):
for field_key, field in extend_class().get_extra_fields(object) or []:
form.fields[field_key] = field
[docs] def get_form(self, form_class=None):
form = super(ModifiableViewMixin, self).get_form(self.form_class)
self.add_extra_fields(form, self.object)
return form
[docs] def form_valid_hook(self, form, object):
has_extension_errors = False
for extend_class in get_provide_objects(form.form_modifier_provide_key):
try:
extend_class().form_valid_hook(form, object)
except Problem as problem:
has_extension_errors = True
messages.error(self.request, problem)
return has_extension_errors
@atomic
[docs] def form_valid(self, form):
response = super(ModifiableViewMixin, self).form_valid(form)
has_extension_errors = self.form_valid_hook(form, self.object)
if has_extension_errors:
return self.form_invalid(form)
else:
return response