Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
CIRCLE
/
django-taggit
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Wiki
Members
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
515106b7
authored
Aug 20, 2010
by
Alex Gaynor
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refactor the inheritance heirarchy to allow custom through models, new tests are fialing
parent
f3a56d57
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
77 additions
and
16 deletions
+77
-16
taggit/models.py
+39
-14
taggit/tests/models.py
+29
-1
taggit/tests/tests.py
+9
-1
No files found.
taggit/models.py
View file @
515106b7
...
...
@@ -6,7 +6,7 @@ from django.template.defaultfilters import slugify
from
django.utils.translation
import
ugettext_lazy
as
_
,
ugettext
class
Tag
(
models
.
Model
):
class
Tag
Base
(
models
.
Model
):
name
=
models
.
CharField
(
verbose_name
=
_
(
'Name'
),
max_length
=
100
)
slug
=
models
.
SlugField
(
verbose_name
=
_
(
'Slug'
),
unique
=
True
,
max_length
=
100
)
...
...
@@ -14,8 +14,7 @@ class Tag(models.Model):
return
self
.
name
class
Meta
:
verbose_name
=
_
(
"Tag"
)
verbose_name_plural
=
_
(
"Tags"
)
abstract
=
True
def
save
(
self
,
*
args
,
**
kwargs
):
if
not
self
.
pk
and
not
self
.
slug
:
...
...
@@ -35,7 +34,7 @@ class Tag(models.Model):
while
True
:
try
:
sid
=
transaction
.
savepoint
(
**
trans_kwargs
)
res
=
super
(
Tag
,
self
)
.
save
(
*
args
,
**
kwargs
)
res
=
super
(
Tag
Base
,
self
)
.
save
(
*
args
,
**
kwargs
)
transaction
.
savepoint_commit
(
sid
,
**
trans_kwargs
)
return
res
except
IntegrityError
:
...
...
@@ -45,13 +44,14 @@ class Tag(models.Model):
else
:
return
super
(
Tag
,
self
)
.
save
(
*
args
,
**
kwargs
)
class
Tag
(
TagBase
):
class
Meta
:
verbose_name
=
_
(
"Tag"
)
verbose_name_plural
=
_
(
"Tags"
)
class
TaggedItemBase
(
models
.
Model
):
if
django
.
VERSION
<
(
1
,
2
):
tag
=
models
.
ForeignKey
(
Tag
,
related_name
=
"
%(class)
s_items"
)
else
:
tag
=
models
.
ForeignKey
(
Tag
,
related_name
=
"
%(app_label)
s_
%(class)
s_items"
)
class
ItemBase
(
models
.
Model
):
def
__unicode__
(
self
):
return
ugettext
(
"
%(object)
s tagged with
%(tag)
s"
)
%
{
"object"
:
self
.
content_object
,
...
...
@@ -82,15 +82,34 @@ class TaggedItemBase(models.Model):
})
.
distinct
()
class
TaggedItem
(
TaggedItemBase
):
class
TaggedItemBase
(
ItemBase
):
if
django
.
VERSION
<
(
1
,
2
):
tag
=
models
.
ForeignKey
(
Tag
,
related_name
=
"
%(class)
s_items"
)
else
:
tag
=
models
.
ForeignKey
(
Tag
,
related_name
=
"
%(app_label)
s_
%(class)
s_items"
)
class
Meta
:
abstract
=
True
class
GenericTaggedItemBase
(
ItemBase
):
object_id
=
models
.
IntegerField
(
verbose_name
=
_
(
'Object id'
),
db_index
=
True
)
content_type
=
models
.
ForeignKey
(
ContentType
,
verbose_name
=
_
(
'Content type'
),
related_name
=
"tagged_items"
)
if
django
.
VERSION
<
(
1
,
2
):
content_type
=
models
.
ForeignKey
(
ContentType
,
verbose_name
=
_
(
'Content type'
),
related_name
=
"
%(class)
s_tagged_items"
)
else
:
content_type
=
models
.
ForeignKey
(
ContentType
,
verbose_name
=
_
(
'Content type'
),
related_name
=
"
%(app_label)
s_
%(class)
s_tagged_items"
)
content_object
=
GenericForeignKey
()
class
Meta
:
verbose_name
=
_
(
"Tagged Item"
)
verbose_name_plural
=
_
(
"Tagged Items"
)
abstract
=
True
@classmethod
def
lookup_kwargs
(
cls
,
instance
):
...
...
@@ -111,3 +130,9 @@ class TaggedItem(TaggedItemBase):
'
%
s__content_type'
%
cls
.
tag_relname
():
ct
})
.
distinct
()
class
TaggedItem
(
GenericTaggedItemBase
,
TaggedItemBase
):
class
Meta
:
verbose_name
=
_
(
"Tagged Item"
)
verbose_name_plural
=
_
(
"Tagged Items"
)
taggit/tests/models.py
View file @
515106b7
from
django.db
import
models
from
taggit.managers
import
TaggableManager
from
taggit.models
import
TaggedItemBase
from
taggit.models
import
TaggedItemBase
,
GenericTaggedItemBase
,
TagBase
class
Food
(
models
.
Model
):
...
...
@@ -75,3 +75,31 @@ class CustomPKPet(models.Model):
class
CustomPKHousePet
(
CustomPKPet
):
trained
=
models
.
BooleanField
()
# Test custom through model to a custom tag model
class
OfficialTag
(
TagBase
):
official
=
models
.
BooleanField
()
class
OfficialThroughModel
(
GenericTaggedItemBase
):
tag
=
models
.
ForeignKey
(
OfficialTag
,
related_name
=
"tagged_items"
)
class
OfficialFood
(
models
.
Model
):
name
=
models
.
CharField
(
max_length
=
50
,
primary_key
=
True
)
tags
=
TaggableManager
(
through
=
OfficialThroughModel
)
def
__unicode__
(
self
):
return
self
.
name
class
OfficialPet
(
models
.
Model
):
name
=
models
.
CharField
(
max_length
=
50
,
primary_key
=
True
)
tags
=
TaggableManager
(
through
=
OfficialThroughModel
)
def
__unicode__
(
self
):
return
self
.
name
class
OfficialHousePet
(
CustomPKPet
):
trained
=
models
.
BooleanField
()
taggit/tests/tests.py
View file @
515106b7
...
...
@@ -6,7 +6,8 @@ from taggit.models import Tag, TaggedItem
from
taggit.tests.forms
import
FoodForm
,
DirectFoodForm
,
CustomPKFoodForm
from
taggit.tests.models
import
(
Food
,
Pet
,
HousePet
,
DirectFood
,
DirectPet
,
DirectHousePet
,
TaggedPet
,
CustomPKFood
,
CustomPKPet
,
CustomPKHousePet
,
TaggedCustomPKPet
)
TaggedCustomPKPet
,
OfficialFood
,
OfficialPet
,
OfficialHousePet
,
OfficialThroughModel
)
from
taggit.utils
import
parse_tags
,
edit_string_for_tags
...
...
@@ -213,6 +214,13 @@ class TaggableManagerCustomPKTestCase(TaggableManagerTestCase):
# tell if the instance is saved or not
pass
class
TaggableManagerOfficialTestCase
(
TaggableManagerTestCase
):
food_model
=
OfficialFood
pet_model
=
OfficialPet
housepet_model
=
OfficialHousePet
taggeditem_model
=
OfficialThroughModel
class
TaggableFormTestCase
(
BaseTaggingTestCase
):
form_class
=
FoodForm
food_model
=
Food
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment