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