Skip to content

Commit

Permalink
Moved TaggedItemBase.tags_for() to ItemBase.
Browse files Browse the repository at this point in the history
ItemBase.tags_for() was moved to TaggedItemBase in 998ef2f as part of a
fix to avoid direct reference to the default Tag model. The change made
use of ItemBase.tag_model() instead so moving ItemBase.tags_for() was
unnecessary and makes subclassing ItemBase more difficult.

Fixes #101.
  • Loading branch information
ngnpope authored and jdufresne committed Aug 8, 2019
1 parent c76d4d2 commit 5a74185
Show file tree
Hide file tree
Showing 5 changed files with 245 additions and 9 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
Changelog
=========

UNRELEASED
~~~~~~~~~~

* Moved TaggedItemBase.tags_for() to ItemBase.

1.1.0 (2019-03-22)
~~~~~~~~~~~~~~~~~~

Expand Down
18 changes: 9 additions & 9 deletions taggit/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,15 +102,6 @@ def tag_relname(cls):
def lookup_kwargs(cls, instance):
return {"content_object": instance}


class TaggedItemBase(ItemBase):
tag = models.ForeignKey(
Tag, related_name="%(app_label)s_%(class)s_items", on_delete=models.CASCADE
)

class Meta:
abstract = True

@classmethod
def tags_for(cls, model, instance=None, **extra_filters):
kwargs = extra_filters or {}
Expand All @@ -121,6 +112,15 @@ def tags_for(cls, model, instance=None, **extra_filters):
return cls.tag_model().objects.filter(**kwargs).distinct()


class TaggedItemBase(ItemBase):
tag = models.ForeignKey(
Tag, related_name="%(app_label)s_%(class)s_items", on_delete=models.CASCADE
)

class Meta:
abstract = True


class CommonGenericTaggedItemBase(ItemBase):
content_type = models.ForeignKey(
ContentType,
Expand Down
165 changes: 165 additions & 0 deletions tests/migrations/0001_initial.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,36 @@ class Migration(migrations.Migration):
("name", models.CharField(max_length=50)),
],
),
migrations.CreateModel(
name="DirectTrackedFood",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name", models.CharField(max_length=50)),
],
),
migrations.CreateModel(
name="DirectTrackedPet",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name", models.CharField(max_length=50)),
],
),
migrations.CreateModel(
name="BlankTagModel",
fields=[
Expand Down Expand Up @@ -287,6 +317,35 @@ class Migration(migrations.Migration):
),
],
),
migrations.CreateModel(
name="TrackedTag",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"name",
models.CharField(max_length=100, unique=True, verbose_name="Name"),
),
(
"slug",
models.SlugField(max_length=100, unique=True, verbose_name="Slug"),
),
("created_by", models.CharField(max_length=50)),
("created_dt", models.DateTimeField(auto_now_add=True)),
(
"description",
models.TextField(blank=True, max_length=255, null=True),
),
],
options={"abstract": False},
),
migrations.CreateModel(
name="Parent",
fields=[
Expand Down Expand Up @@ -437,6 +496,46 @@ class Migration(migrations.Migration):
],
options={"abstract": False},
),
migrations.CreateModel(
name="TaggedTrackedFood",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"content_object",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to="tests.DirectTrackedFood",
),
),
("created_by", models.CharField(max_length=50)),
("created_dt", models.DateTimeField(auto_now_add=True)),
],
),
migrations.CreateModel(
name="TaggedTrackedPet",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("created_by", models.CharField(max_length=50)),
("created_dt", models.DateTimeField(auto_now_add=True)),
],
options={"abstract": False},
),
migrations.CreateModel(
name="Through1",
fields=[
Expand Down Expand Up @@ -702,6 +801,24 @@ class Migration(migrations.Migration):
],
bases=("tests.officialpet",),
),
migrations.CreateModel(
name="DirectTrackedHousePet",
fields=[
(
"directtrackedpet_ptr",
models.OneToOneField(
auto_created=True,
on_delete=django.db.models.deletion.CASCADE,
parent_link=True,
primary_key=True,
serialize=False,
to="tests.DirectTrackedPet",
),
),
("trained", models.BooleanField(default=False)),
],
bases=("tests.directtrackedpet",),
),
migrations.AddField(
model_name="uuidfood",
name="tags",
Expand Down Expand Up @@ -764,6 +881,31 @@ class Migration(migrations.Migration):
to="taggit.Tag",
),
),
migrations.AddField(
model_name="taggedtrackedpet",
name="content_object",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="tests.DirectTrackedPet"
),
),
migrations.AddField(
model_name="taggedtrackedpet",
name="tag",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="tests_taggedtrackedpet_items",
to="tests.TrackedTag",
),
),
migrations.AddField(
model_name="taggedtrackedfood",
name="tag",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="tests_taggedtrackedfood_items",
to="tests.TrackedTag",
),
),
migrations.AddField(
model_name="taggedcustompkpet",
name="content_object",
Expand Down Expand Up @@ -944,6 +1086,26 @@ class Migration(migrations.Migration):
verbose_name="Tags",
),
),
migrations.AddField(
model_name="directtrackedpet",
name="tags",
field=taggit.managers.TaggableManager(
help_text="A comma-separated list of tags.",
through="tests.TaggedTrackedPet",
to="tests.TrackedTag",
verbose_name="Tags",
),
),
migrations.AddField(
model_name="directtrackedfood",
name="tags",
field=taggit.managers.TaggableManager(
help_text="A comma-separated list of tags.",
through="tests.TaggedTrackedFood",
to="tests.TrackedTag",
verbose_name="Tags",
),
),
migrations.AddField(
model_name="directcustompkpet",
name="tags",
Expand Down Expand Up @@ -1007,6 +1169,9 @@ class Migration(migrations.Migration):
migrations.AlterUniqueTogether(
name="taggedfood", unique_together={("content_object", "tag")}
),
migrations.AlterUniqueTogether(
name="taggedtrackedfood", unique_together={("content_object", "tag")}
),
migrations.AlterUniqueTogether(
name="taggedcustompkpet", unique_together={("content_object", "tag")}
),
Expand Down
53 changes: 53 additions & 0 deletions tests/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
CommonGenericTaggedItemBase,
GenericTaggedItemBase,
GenericUUIDTaggedItemBase,
ItemBase,
Tag,
TagBase,
TaggedItem,
Expand Down Expand Up @@ -105,6 +106,58 @@ class DirectHousePet(DirectPet):
trained = models.BooleanField(default=False)


# Test direct-tagging with custom through model and custom tag


class TrackedTag(TagBase):
created_by = models.CharField(max_length=50)
created_dt = models.DateTimeField(auto_now_add=True)
description = models.TextField(blank=True, max_length=255, null=True)


class TaggedTrackedFood(ItemBase):
content_object = models.ForeignKey("DirectTrackedFood", on_delete=models.CASCADE)
tag = models.ForeignKey(
TrackedTag, on_delete=models.CASCADE, related_name="%(class)s_items"
)
created_by = models.CharField(max_length=50)
created_dt = models.DateTimeField(auto_now_add=True)

class Meta:
unique_together = ["content_object", "tag"]


class TaggedTrackedPet(ItemBase):
content_object = models.ForeignKey("DirectTrackedPet", on_delete=models.CASCADE)
tag = models.ForeignKey(
TrackedTag, on_delete=models.CASCADE, related_name="%(class)s_items"
)
created_by = models.CharField(max_length=50)
created_dt = models.DateTimeField(auto_now_add=True)


class DirectTrackedFood(models.Model):
name = models.CharField(max_length=50)

tags = TaggableManager(through=TaggedTrackedFood)

def __str__(self):
return self.name


class DirectTrackedPet(models.Model):
name = models.CharField(max_length=50)

tags = TaggableManager(through=TaggedTrackedPet)

def __str__(self):
return self.name


class DirectTrackedHousePet(DirectTrackedPet):
trained = models.BooleanField(default=False)


# Test custom through model to model with custom PK


Expand Down
13 changes: 13 additions & 0 deletions tests/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@
DirectFood,
DirectHousePet,
DirectPet,
DirectTrackedFood,
DirectTrackedHousePet,
DirectTrackedPet,
Food,
HousePet,
Movie,
Expand All @@ -43,6 +46,8 @@
TaggedCustomPK,
TaggedCustomPKFood,
TaggedFood,
TaggedTrackedFood,
TrackedTag,
UUIDFood,
UUIDTag,
)
Expand Down Expand Up @@ -737,6 +742,14 @@ class TaggableManagerDirectTestCase(TaggableManagerTestCase):
taggeditem_model = TaggedFood


class TaggableManagerDirectTrackedTestCase(TaggableManagerTestCase):
food_model = DirectTrackedFood
pet_model = DirectTrackedPet
housepet_model = DirectTrackedHousePet
taggeditem_model = TaggedTrackedFood
tag_model = TrackedTag


class TaggableManagerDirectCustomPKTestCase(TaggableManagerTestCase):
food_model = DirectCustomPKFood
pet_model = DirectCustomPKPet
Expand Down

0 comments on commit 5a74185

Please sign in to comment.