from tagging.fields import TagField
from tagging.models import Tag
from utils import tags2str, get_tag_name_list
from validators import isMultiWordTagList, NumMultiWordTags

class MultiWordTagField(TagField):
    def __init__(self, min_tags=None, max_tags=None, *args, **kwdargs):
        # TagField has this nasty 'override' for blank, this will undo it.
        kwdargs['blank'] = kwdargs.get('blank', False)
        super(TagField, self).__init__(*args, **kwdargs)
        validators = [isMultiWordTagList]
        if (not self.blank and not self.null and 
            (min_tags is None or min_tags < 1)):
            min_tags = 1
        if min_tags or max_tags:
            validators.append(NumMultiWordTags(min_tags, max_tags))
        self.validator_list = validators + kwdargs.get(
            'validator_list', [])
    def _save(self, signal, sender, instance):
        """
        Save tags back to the database
        """
        tags = self._get_instance_tag_cache(instance)
        if tags is not None :
            tags = u' '.join(get_tag_name_list(tags, space='_'))
            Tag.objects.update_tags(instance, tags)

