38 lines
1.4 KiB
Python
38 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
|
|
}
|