Source code for shuup.admin.utils.forms

# -*- 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.
from __future__ import unicode_literals

import six
from django.contrib import messages
from django.core.exceptions import NON_FIELD_ERRORS
from django.forms.utils import flatatt


[docs]def filter_form_field_choices(field, predicate, invert=False): """ Filter choices of a form field and its widget by predicate. The predicate may be a callable of the signature ``(pair) -> bool`` or an iterable of allowable values. :param field: Form field. :type field: django.forms.Field :param predicate: Predicate. :type predicate: function|Iterable :param invert: Invert the semantics of the predicate, i.e. items matching it will be rejected. :type invert: bool :return: Nothing. The field is modified in-place. """ if not callable(predicate): allowed_values = set(predicate) def predicate(pair): return pair[0] in allowed_values if invert: choices = [pair for pair in field.choices if not predicate(pair)] else: choices = [pair for pair in field.choices if predicate(pair)] field.choices = field.widget.choices = choices
[docs]def add_form_errors_as_messages(request, form): """ Add the form's errors, if any, into the request as messages. :param request: Request to messagify. :type request: django.http.HttpRequest :param form: The errorful form. :type form: django.forms.Form :return: Number of messages added. May be thousands, for a very unlucky form. :rtype: int """ n_messages = 0 for field_name, errors in form.errors.items(): if field_name != NON_FIELD_ERRORS: field_label = form[field_name].label else: field_label = "" for error in errors: messages.error(request, "%s %s" % (field_label, error)) n_messages += 1 return n_messages
[docs]def flatatt_filter(attrs): attrs = dict((key, value) for (key, value) in six.iteritems(attrs) if key and value) return flatatt(attrs)
[docs]def get_possible_name_fields_for_model(model): """ Get possible name fields for given model. This function yields strings of field names that could possible be identified as name fields for model. For example get_possible_name_fields_for_model(Coupon) yields string "code" :param model Class object of the model: :type model object: :return: Yield strings of possible name fields. :rtype: str """ if hasattr(model, "name_field"): yield model.name_field for field in model._meta.local_fields: if field.name in ["name", "title", "username"]: yield field.name if hasattr(model, "_parler_meta"): for field in model._parler_meta.root_model._meta.get_fields(): if field.name not in ("master", "id", "language_code", "description"): yield field.name