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