"""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 }