41 lines
1.4 KiB
Python
41 lines
1.4 KiB
Python
"""passbook form helpers"""
|
|
from django import forms
|
|
|
|
from passbook.admin.fields import YAMLField
|
|
|
|
|
|
class TagModelForm(forms.ModelForm):
|
|
"""Base form for models that have attributes"""
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
# Check if we have an instance, load tags otherwise use an empty dict
|
|
instance = kwargs.get("instance", None)
|
|
tags = instance.tags if instance else {}
|
|
# Make sure all predefined tags exist in tags, and set default if they don't
|
|
predefined_tags = (
|
|
self._meta.model().get_predefined_tags()
|
|
) # pylint: disable=no-member
|
|
for key, value in predefined_tags.items():
|
|
if key not in tags:
|
|
tags[key] = value
|
|
# Format JSON
|
|
kwargs["initial"]["tags"] = tags
|
|
super().__init__(*args, **kwargs)
|
|
|
|
def clean_tags(self):
|
|
"""Make sure all required tags are set"""
|
|
if hasattr(self.instance, "get_required_keys") and hasattr(
|
|
self.instance, "tags"
|
|
):
|
|
for key in self.instance.get_required_keys():
|
|
if key not in self.cleaned_data.get("tags"):
|
|
raise forms.ValidationError("Tag %s missing." % key)
|
|
return self.cleaned_data.get("tags")
|
|
|
|
|
|
# pylint: disable=too-few-public-methods
|
|
class TagModelFormMeta:
|
|
"""Base Meta class that uses the YAMLField"""
|
|
|
|
field_classes = {"tags": YAMLField}
|