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)
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)
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)
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
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)