-from django.db.models import Q
-from catalogue.models import Book, Tag
-from catalogue import utils
-from catalogue.tasks import touch_tag
-from social.models import Cite
-
-
-def likes(user, work):
- return user.is_authenticated() and work.tags.filter(category='set', user=user).exists()
-
-
-def get_set(user, name):
- """Returns a tag for use by the user. Creates it, if necessary."""
- try:
- tag = Tag.objects.get(category='set', user=user, name=name)
- except Tag.DoesNotExist:
- tag = Tag.objects.create(category='set', user=user, name=name,
- slug=utils.get_random_hash(name), sort_key=name.lower())
- return tag
-
-
-def set_sets(user, work, sets):
- """Set tags used for given work by a given user."""
-
- old_sets = list(work.tags.filter(category='set', user=user))
-
- work.tags = sets + list(
- work.tags.filter(~Q(category='set') | ~Q(user=user)))
-
- for shelf in [shelf for shelf in old_sets if shelf not in sets]:
- touch_tag(shelf)
- for shelf in [shelf for shelf in sets if shelf not in old_sets]:
- touch_tag(shelf)
-
- # delete empty tags
- Tag.objects.filter(category='set', user=user, book_count=0).delete()
-
-
-def cites_for_tags(tags):
- """Returns a QuerySet with all Cites for books with given tags."""
- books = Book.tagged.with_all(tags).order_by().values_list('id', flat=True)
- books = list(books)
- return Cite.objects.filter(book__id__in=books)