web/lib/tagging/managers.py
changeset 11 f236caaceb43
equal deleted inserted replaced
10:7207a5a27b8f 11:f236caaceb43
       
     1 """
       
     2 Custom managers for Django models registered with the tagging
       
     3 application.
       
     4 """
       
     5 from django.contrib.contenttypes.models import ContentType
       
     6 from django.db import models
       
     7 
       
     8 from tagging.models import Tag, TaggedItem
       
     9 
       
    10 class ModelTagManager(models.Manager):
       
    11     """
       
    12     A manager for retrieving tags for a particular model.
       
    13     """
       
    14     def get_query_set(self):
       
    15         ctype = ContentType.objects.get_for_model(self.model)
       
    16         return Tag.objects.filter(
       
    17             items__content_type__pk=ctype.pk).distinct()
       
    18 
       
    19     def cloud(self, *args, **kwargs):
       
    20         return Tag.objects.cloud_for_model(self.model, *args, **kwargs)
       
    21 
       
    22     def related(self, tags, *args, **kwargs):
       
    23         return Tag.objects.related_for_model(tags, self.model, *args, **kwargs)
       
    24 
       
    25     def usage(self, *args, **kwargs):
       
    26         return Tag.objects.usage_for_model(self.model, *args, **kwargs)
       
    27 
       
    28 class ModelTaggedItemManager(models.Manager):
       
    29     """
       
    30     A manager for retrieving model instances based on their tags.
       
    31     """
       
    32     def related_to(self, obj, queryset=None, num=None):
       
    33         if queryset is None:
       
    34             return TaggedItem.objects.get_related(obj, self.model, num=num)
       
    35         else:
       
    36             return TaggedItem.objects.get_related(obj, queryset, num=num)
       
    37 
       
    38     def with_all(self, tags, queryset=None):
       
    39         if queryset is None:
       
    40             return TaggedItem.objects.get_by_model(self.model, tags)
       
    41         else:
       
    42             return TaggedItem.objects.get_by_model(queryset, tags)
       
    43 
       
    44     def with_any(self, tags, queryset=None):
       
    45         if queryset is None:
       
    46             return TaggedItem.objects.get_union_by_model(self.model, tags)
       
    47         else:
       
    48             return TaggedItem.objects.get_union_by_model(queryset, tags)
       
    49 
       
    50 class TagDescriptor(object):
       
    51     """
       
    52     A descriptor which provides access to a ``ModelTagManager`` for
       
    53     model classes and simple retrieval, updating and deletion of tags
       
    54     for model instances.
       
    55     """
       
    56     def __get__(self, instance, owner):
       
    57         if not instance:
       
    58             tag_manager = ModelTagManager()
       
    59             tag_manager.model = owner
       
    60             return tag_manager
       
    61         else:
       
    62             return Tag.objects.get_for_object(instance)
       
    63 
       
    64     def __set__(self, instance, value):
       
    65         Tag.objects.update_tags(instance, value)
       
    66 
       
    67     def __delete__(self, instance):
       
    68         Tag.objects.update_tags(instance, None)