예제 #1
0
    def add_tags(self, instance, tags):
        """
        Add tags to item
        """
        if is_string(tags):
            tags = string_to_list(tags)

        delta = [x.strip().lower() for x in (set(tags) - set(instance.tags_list)) if x.strip()]
        new_tags = [ Tag.objects.get_or_create(name=x)[0] for x in set(delta) ]

        return self._add_tags(instance, new_tags)
예제 #2
0
    def get_related_by_tags_q(self, tags, q):
        """
        Returns all items with given tags with the Q object
        """
        if is_string(tags):
            tags = tags.split(',')

        tags = escape_tags(tags)
        tags = '|'.join(tags)

        q = Q(tags__regex=r'(%s)' % tags) | q

        return self.model.objects.filter(q)
예제 #3
0
    def remove_tags(self, instance, tags):
        """
        Remove given tags
        """
        if is_string(tags):
            tags = string_to_list(tags)

        tags = set([x.strip().lower() for x in tags if x.strip() ])
        tags = [x for x in tags if x in instance.tags_list]

        if not tags:
            return []

        obsolete_tags = Tag.objects.filter(name__in=tags )

        return self._remove_tags(instance, obsolete_tags)
예제 #4
0
    def get_related_by_tags(self, tags, instance=None):
        """
        Return all items which have given tags
        instance = exclude pk
        """
        if is_string(tags):
            tags = tags.split(',')

        tags = escape_tags(tags)
        tags = '|'.join(tags)
        
        qs = self.model.objects.filter(**{'%s__regex' % self.model._tags_field_name: r'(%s)' % tags })

        if instance is not None:
            qs = qs.exclude(pk=instance.pk)

        return qs
예제 #5
0
    def update_tags(self, instance, tags):
        """
        Update tags from an item
        """
        if not tags:
            return []

        if not is_tagstar_maintained(instance):
            raise ItemNotTagstarMaintained("Item %s is not under Tagstar" % instance.__class__)
        
        if is_string(tags):
            tags = string_to_list(tags)
        
        tags          = set([x.strip().lower() for x in tags])        
        instance_tags = instance._init_tags and set([ x.strip().lower() for x in instance._init_tags.split(',')]) or set()        
        
        if instance_tags != tags:          
            new_tags      = set( Tag.objects.get_or_create(name=x.strip().lower())[0] for x in (tags - instance_tags) if x.strip() )
            obsolete_tags = Tag.objects.filter(name__in=(instance_tags - tags) )
            self._add_tags(instance, new_tags)
            self._remove_tags(instance, obsolete_tags)
            
        return list(tags)