229 lines
5.4 KiB
Python
229 lines
5.4 KiB
Python
from __future__ import unicode_literals
|
|
|
|
from django.db import models
|
|
from django.utils.encoding import python_2_unicode_compatible
|
|
|
|
from taggit.managers import TaggableManager
|
|
from taggit.models import (CommonGenericTaggedItemBase, GenericTaggedItemBase,
|
|
Tag, TagBase, TaggedItem, TaggedItemBase)
|
|
|
|
|
|
# Ensure that two TaggableManagers with custom through model are allowed.
|
|
class Through1(TaggedItemBase):
|
|
content_object = models.ForeignKey('MultipleTags')
|
|
|
|
|
|
class Through2(TaggedItemBase):
|
|
content_object = models.ForeignKey('MultipleTags')
|
|
|
|
|
|
class MultipleTags(models.Model):
|
|
tags1 = TaggableManager(through=Through1, related_name='tags1')
|
|
tags2 = TaggableManager(through=Through2, related_name='tags2')
|
|
|
|
# Ensure that two TaggableManagers with GFK via different through models are allowed.
|
|
class ThroughGFK(GenericTaggedItemBase):
|
|
tag = models.ForeignKey(Tag, related_name='tagged_items')
|
|
|
|
class MultipleTagsGFK(models.Model):
|
|
tags1 = TaggableManager(related_name='tagsgfk1')
|
|
tags2 = TaggableManager(through=ThroughGFK, related_name='tagsgfk2')
|
|
|
|
|
|
@python_2_unicode_compatible
|
|
class Food(models.Model):
|
|
name = models.CharField(max_length=50)
|
|
|
|
tags = TaggableManager()
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
@python_2_unicode_compatible
|
|
class Pet(models.Model):
|
|
name = models.CharField(max_length=50)
|
|
|
|
tags = TaggableManager()
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
|
|
class HousePet(Pet):
|
|
trained = models.BooleanField(default=False)
|
|
|
|
|
|
# Test direct-tagging with custom through model
|
|
|
|
class TaggedFood(TaggedItemBase):
|
|
content_object = models.ForeignKey('DirectFood')
|
|
|
|
|
|
class TaggedPet(TaggedItemBase):
|
|
content_object = models.ForeignKey('DirectPet')
|
|
|
|
|
|
@python_2_unicode_compatible
|
|
class DirectFood(models.Model):
|
|
name = models.CharField(max_length=50)
|
|
|
|
tags = TaggableManager(through='TaggedFood')
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
|
|
@python_2_unicode_compatible
|
|
class DirectPet(models.Model):
|
|
name = models.CharField(max_length=50)
|
|
|
|
tags = TaggableManager(through=TaggedPet)
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
|
|
class DirectHousePet(DirectPet):
|
|
trained = models.BooleanField(default=False)
|
|
|
|
|
|
# Test custom through model to model with custom PK
|
|
|
|
class TaggedCustomPKFood(TaggedItemBase):
|
|
content_object = models.ForeignKey('DirectCustomPKFood')
|
|
|
|
class TaggedCustomPKPet(TaggedItemBase):
|
|
content_object = models.ForeignKey('DirectCustomPKPet')
|
|
|
|
@python_2_unicode_compatible
|
|
class DirectCustomPKFood(models.Model):
|
|
name = models.CharField(max_length=50, primary_key=True)
|
|
|
|
tags = TaggableManager(through=TaggedCustomPKFood)
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
@python_2_unicode_compatible
|
|
class DirectCustomPKPet(models.Model):
|
|
name = models.CharField(max_length=50, primary_key=True)
|
|
|
|
tags = TaggableManager(through=TaggedCustomPKPet)
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
class DirectCustomPKHousePet(DirectCustomPKPet):
|
|
trained = models.BooleanField(default=False)
|
|
|
|
# Test custom through model to model with custom PK using GenericForeignKey
|
|
|
|
class TaggedCustomPK(CommonGenericTaggedItemBase, TaggedItemBase):
|
|
object_id = models.CharField(max_length=50, verbose_name='Object id', db_index=True)
|
|
|
|
@python_2_unicode_compatible
|
|
class CustomPKFood(models.Model):
|
|
name = models.CharField(max_length=50, primary_key=True)
|
|
|
|
tags = TaggableManager(through=TaggedCustomPK)
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
@python_2_unicode_compatible
|
|
class CustomPKPet(models.Model):
|
|
name = models.CharField(max_length=50, primary_key=True)
|
|
|
|
tags = TaggableManager(through=TaggedCustomPK)
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
class CustomPKHousePet(CustomPKPet):
|
|
trained = models.BooleanField(default=False)
|
|
|
|
# Test custom through model to a custom tag model
|
|
|
|
class OfficialTag(TagBase):
|
|
official = models.BooleanField(default=False)
|
|
|
|
class OfficialThroughModel(GenericTaggedItemBase):
|
|
tag = models.ForeignKey(OfficialTag, related_name="tagged_items")
|
|
|
|
@python_2_unicode_compatible
|
|
class OfficialFood(models.Model):
|
|
name = models.CharField(max_length=50)
|
|
|
|
tags = TaggableManager(through=OfficialThroughModel)
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
@python_2_unicode_compatible
|
|
class OfficialPet(models.Model):
|
|
name = models.CharField(max_length=50)
|
|
|
|
tags = TaggableManager(through=OfficialThroughModel)
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
class OfficialHousePet(OfficialPet):
|
|
trained = models.BooleanField(default=False)
|
|
|
|
|
|
class Media(models.Model):
|
|
tags = TaggableManager()
|
|
|
|
class Meta:
|
|
abstract = True
|
|
|
|
class Photo(Media):
|
|
pass
|
|
|
|
class Movie(Media):
|
|
pass
|
|
|
|
|
|
class ArticleTag(Tag):
|
|
class Meta:
|
|
proxy = True
|
|
|
|
def slugify(self, tag, i=None):
|
|
slug = "category-%s" % tag.lower()
|
|
|
|
if i is not None:
|
|
slug += "-%d" % i
|
|
return slug
|
|
|
|
|
|
class ArticleTaggedItem(TaggedItem):
|
|
class Meta:
|
|
proxy = True
|
|
|
|
@classmethod
|
|
def tag_model(self):
|
|
return ArticleTag
|
|
|
|
|
|
class Article(models.Model):
|
|
title = models.CharField(max_length=100)
|
|
|
|
tags = TaggableManager(through=ArticleTaggedItem)
|
|
|
|
|
|
class CustomManager(models.Model):
|
|
class Foo(object):
|
|
def __init__(*args, **kwargs):
|
|
pass
|
|
|
|
tags = TaggableManager(manager=Foo)
|
|
|
|
|
|
class Parent(models.Model):
|
|
tags = TaggableManager()
|
|
|
|
|
|
class Child(Parent):
|
|
pass
|