def clean()

in kitsune/wiki/forms.py [0:0]


    def clean(self):
        cdata = super(DocumentForm, self).clean()
        locale = cdata.get("locale")

        # Products are required for en-US
        product_ids = set(map(int, cdata.get("products", [])))
        if locale == settings.WIKI_DEFAULT_LANGUAGE and (not product_ids or len(product_ids) < 1):
            raise forms.ValidationError(PRODUCT_REQUIRED)

        # Topics are required for en-US
        topic_ids = set(map(int, cdata.get("topics", [])))
        if locale == settings.WIKI_DEFAULT_LANGUAGE and (not topic_ids or len(topic_ids) < 1):
            raise forms.ValidationError(TOPIC_REQUIRED)

        invalid_topics = []
        for topic in Topic.active.filter(id__in=topic_ids):
            topic_product_ids = set(topic.products.values_list("id", flat=True))
            if not product_ids.issubset(topic_product_ids):
                invalid_topics.append(topic)

        invalid_products = []
        for product in Product.active.filter(id__in=product_ids):
            product_topic_ids = set(product.m2m_topics.values_list("id", flat=True))
            if not topic_ids.issubset(product_topic_ids):
                invalid_products.append(product)

        error_message = ""
        if invalid_topics or invalid_products:
            invalid_items = (
                invalid_products if len(invalid_topics) > len(invalid_products) else invalid_topics
            )
            invalid_item_names = ", ".join([item.title for item in invalid_items])

            error_message = _nlazy(
                (
                    f"The following {'product' if invalid_items is invalid_products else 'topic'} "
                    f"is not associated with all selected "
                    f"{'topics' if invalid_items is invalid_products else 'products'}: %(items)s"
                ),
                (
                    f"The following {'products' if invalid_items is invalid_products else 'topics'} "  # noqa
                    f"are not associated with all selected "
                    f"{'topics' if invalid_items is invalid_products else 'products'}: %(items)s"
                ),
                len(invalid_items),
            ) % {"items": invalid_item_names}

            if error_message:
                raise forms.ValidationError(error_message)

        return cdata