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
A prog2-höz tartozó friss repo anyagok itt elérhetőek:
https://git.iit.bme.hu/
Commit
57e30c5f
authored
Apr 24, 2010
by
Alex Gaynor
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Some minor cleanup, renaming.
parent
f364ac09
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
87 additions
and
71 deletions
+87
-71
AUTHORS.txt
+1
-0
README.txt
+2
-0
taggit/contrib/suggest/README.txt
+14
-10
taggit/contrib/suggest/admin.py
+8
-5
taggit/contrib/suggest/models.py
+18
-13
taggit/contrib/suggest/tests/__init__.py
+0
-1
taggit/contrib/suggest/tests/settings.py
+1
-0
taggit/contrib/suggest/tests/tests.py
+22
-16
taggit/contrib/suggest/utils.py
+21
-26
No files found.
AUTHORS.txt
View file @
57e30c5f
...
...
@@ -7,3 +7,4 @@ fakeempire <adam@fakeempire.com>
Ben Firshman <ben@firshman.co.uk>
Alex Gaynor <alex.gaynor@gmail.com>
Rob Hudson <rob@cogit8.org>
Frank Wiles
README.txt
View file @
57e30c5f
...
...
@@ -27,3 +27,5 @@ Then you can use the API like so:
Tags will show up for you automatically in forms and the admin.
``django-taggit`` requires Django 1.1 or greater.
taggit/contrib/suggest/README.txt
View file @
57e30c5f
taggit.contrib.suggest
======================
...
...
@@ -9,23 +8,28 @@ thing.
For example, if your site is a humor site you might want to collapse all of
#fun, #funny, #funnies, #hilarious, #rofl, and #lol into one tag #funny. The
suggest_tags() function in taggit.contrib.suggest.utils will give you a list
of tags that seem appropriate for the text content given to it.
``suggest_tags()`` function in ``taggit.contrib.suggest.utils`` will give you a
list of tags that seem appropriate for the text content given to it.
Unlike the rest of ``django-taggit``, ``suggest`` requires Django 1.2.
Usage
=====
Put 'taggit.contrib.suggest' into INSTALLED_APPS and run a syncdb to create
the necessary models. This will add Keywords and Regular Expression inlines
to the default django-taggit admin. Once you've populated those based on your
site you can do a simple:
Put ``'taggit.contrib.suggest'`` into ``INSTALLED_APPS`` and run a syncdb to
create the necessary models. This will add ``Keywords`` and
``Regular Expression`` inlines to the default ``django-taggit`` admin. Once
you've populated those based on your site you can do a simple:
.. sourcecode:: python
from taggit.contrib.suggest.utils import suggest_tags
from taggit.contrib.suggest.utils import suggest_tags
tags = suggest_tags(content='Some textual content...')
tags = suggest_tags(content='Some textual content...')
TODO
====
* In a later version I hope to a simple way to help determine keywords for you
automatically, by learning from your past tags and content.
automatically, by learning from your past tags and content.
taggit/contrib/suggest/admin.py
View file @
57e30c5f
from
django.contrib
import
admin
from
taggit.models
import
Tag
from
taggit.admin
import
TaggedItemInline
from
taggit.contrib.suggest.models
import
TagKeyword
,
TagRegExp
from
taggit.contrib.suggest.models
import
TagKeyword
,
TagRegex
from
taggit.models
import
Tag
class
TagKeywordInline
(
admin
.
StackedInline
):
model
=
TagKeyword
class
TagRegExpInline
(
admin
.
StackedInline
):
model
=
TagRegExp
class
TagRegxInline
(
admin
.
StackedInline
):
model
=
TagRegex
class
TagSuggestAdmin
(
admin
.
ModelAdmin
):
inlines
=
[
TaggedItemInline
,
TagKeywordInline
,
TagReg
Exp
Inline
,
TagReg
x
Inline
,
]
admin
.
site
.
unregister
(
Tag
)
admin
.
site
.
register
(
Tag
,
TagSuggestAdmin
)
taggit/contrib/suggest/models.py
View file @
57e30c5f
import
re
from
django.db
import
models
from
django.core.exceptions
import
ValidationError
from
django.db
import
models
from
taggit.models
import
Tag
HAS_PYSTEMMER
=
True
try
:
import
Stemmer
except
ImportError
:
HAS_PYSTEMMER
=
False
Stemmer
=
None
class
TagKeyword
(
models
.
Model
):
""" Model to associate simple keywords to a Tag """
...
...
@@ -22,25 +23,29 @@ class TagKeyword(models.Model):
def
save
(
self
,
*
args
,
**
kwargs
):
""" Stem the keyword on save if they have PyStemmer """
language
=
kwargs
.
pop
(
'stemmer-language'
,
'english'
)
if
not
self
.
id
and
not
self
.
stem
and
HAS_PYSTEMMER
:
if
not
self
.
pk
and
not
self
.
stem
and
Stemmer
:
stemmer
=
Stemmer
.
Stemmer
(
language
)
self
.
stem
=
stemmer
.
stemWord
(
self
.
keyword
)
super
(
TagKeyword
,
self
)
.
save
(
*
args
,
**
kwargs
)
super
(
TagKeyword
,
self
)
.
save
(
*
args
,
**
kwargs
)
def
validate_regex
p
(
value
):
def
validate_regex
(
value
):
""" Make sure we have a valid regular expression """
try
:
re
.
compile
(
value
)
except
:
except
Exception
:
raise
ValidationError
(
'Please enter a valid regular expression'
)
class
TagRegExp
(
models
.
Model
):
class
TagRegex
(
models
.
Model
):
""" Model to associate regular expressions with a Tag """
tag
=
models
.
ForeignKey
(
Tag
,
related_name
=
'regex
p
s'
)
tag
=
models
.
ForeignKey
(
Tag
,
related_name
=
'regex
e
s'
)
name
=
models
.
CharField
(
max_length
=
30
)
regexp
=
models
.
CharField
(
max_length
=
250
,
validators
=
[
validate_regexp
],
help_text
=
'Enter a valid Regular Expression. To make it case-insensitive include "(?i)" in your expression.'
regex
=
models
.
CharField
(
max_length
=
250
,
validators
=
[
validate_regex
],
help_text
=
(
'Enter a valid Regular Expression. To make it '
'case-insensitive include "(?i)" in your expression.'
)
)
def
__unicode__
(
self
):
...
...
@@ -49,4 +54,4 @@ class TagRegExp(models.Model):
def
save
(
self
,
*
args
,
**
kwargs
):
""" Make sure to validate """
self
.
full_clean
()
super
(
TagReg
Exp
,
self
)
.
save
(
*
args
,
**
kwargs
)
super
(
TagReg
ex
,
self
)
.
save
(
*
args
,
**
kwargs
)
taggit/contrib/suggest/tests/__init__.py
View file @
57e30c5f
from
taggit.contrib.suggest.tests.tests
import
SuggestCase
taggit/contrib/suggest/tests/settings.py
View file @
57e30c5f
...
...
@@ -3,5 +3,6 @@ DATABASE_ENGINE = 'sqlite3'
INSTALLED_APPS
=
[
'django.contrib.contenttypes'
,
'taggit'
,
'taggit.tests'
,
'taggit.contrib.suggest'
,
]
taggit/contrib/suggest/tests/tests.py
View file @
57e30c5f
from
django.test
import
TestCase
from
django.core.exceptions
import
ValidationError
from
taggit.models
import
Tag
from
taggit.contrib.suggest.models
import
TagKeyword
,
TagRegExp
from
django.test
import
TestCase
from
taggit.contrib.suggest.models
import
TagKeyword
,
TagRegex
from
taggit.contrib.suggest.utils
import
suggest_tags
from
taggit.models
import
Tag
class
SuggestCase
(
TestCase
):
def
test_simple_suggest
(
self
):
ku_tag
=
Tag
.
objects
.
create
(
name
=
'ku'
)
ku_keyword1
=
TagKeyword
.
objects
.
create
(
tag
=
ku_tag
,
keyword
=
'kansas university'
)
keyword
=
'kansas university'
)
suggested_tags
=
suggest_tags
(
content
=
'I used to be a student at kansas university'
)
suggested_tags
=
suggest_tags
(
'I used to be a student at kansas university'
)
self
.
assertTrue
(
ku_tag
in
suggested_tags
)
def
test_regex
p_suggest
(
self
):
def
test_regex
_suggest
(
self
):
ku_tag
=
Tag
.
objects
.
create
(
name
=
'ku'
)
new_regexp
=
TagRegExp
.
objects
.
create
(
TagRegex
.
objects
.
create
(
tag
=
ku_tag
,
name
=
'Find University of Kansas'
,
regexp
=
'University
\
s+of
\
s+Kansas'
)
regex
=
'University
\
s+of
\
s+Kansas'
)
suggested_tags
=
suggest_tags
(
content
=
'I was once a student at the University of Kansas'
)
suggested_tags
=
suggest_tags
(
'I was once a student at the University of Kansas'
)
self
.
assertTrue
(
ku_tag
in
suggested_tags
)
def
test_bad_regex
p
(
self
):
def
test_bad_regex
(
self
):
ku_tag
=
Tag
.
objects
.
create
(
name
=
'ku'
)
ku_keyword1
=
TagKeyword
.
objects
.
create
(
tag
=
ku_tag
,
keyword
=
'kansas university'
)
new_regexp
=
TagRegExp
(
keyword
=
'kansas university'
)
new_regex
=
TagRegex
(
tag
=
ku_tag
,
name
=
'Find University of Kansas'
,
regexp
=
'University
\
s+of(
\
s+Kansas'
)
self
.
assertRaises
(
ValidationError
,
new_regexp
.
save
)
regex
=
'University
\
s+of(
\
s+Kansas'
)
self
.
assertRaises
(
ValidationError
,
new_regex
.
save
)
suggested_tags
=
suggest_tags
(
content
=
'I was once a student at the University of Kansas. Also known as kansas university by the way.'
)
suggested_tags
=
suggest_tags
(
'I was once a student at the University '
'of Kansas. Also known as kansas university by the way.'
)
self
.
assertTrue
(
ku_tag
in
suggested_tags
)
taggit/contrib/suggest/utils.py
View file @
57e30c5f
import
re
from
taggit.models
import
Tag
from
taggit.contrib.suggest.models
import
TagKeyword
,
TagRegExp
from
django.conf
import
settings
from
taggit.contrib.suggest.models
import
TagKeyword
,
TagRegex
from
taggit.models
import
Tag
def
_suggest_keywords
(
content
=
None
):
def
_suggest_keywords
(
content
):
""" Suggest by keywords """
suggested_keywords
=
set
()
keywords
=
TagKeyword
.
objects
.
values_list
(
'keyword'
,
'stem'
,
'tag'
)
keywords
=
TagKeyword
.
objects
.
all
(
)
for
k
in
keywords
:
# Use the stem if available, otherwise use the whole keyword
if
k
[
1
]:
if
k
[
1
]
in
content
:
suggested_keywords
.
add
(
k
[
2
]
)
elif
k
[
0
]
in
content
:
suggested_keywords
.
add
(
k
[
2
]
)
if
k
.
stem
:
if
k
.
stem
in
content
:
suggested_keywords
.
add
(
k
.
tag_id
)
elif
k
.
keyword
in
content
:
suggested_keywords
.
add
(
k
.
tag_id
)
return
suggested_keywords
def
_suggest_regex
ps
(
content
=
None
):
def
_suggest_regex
es
(
content
):
""" Suggest by regular expressions """
# Grab all regular expressions and compile them
suggested_regexps
=
set
()
regexps
=
set
()
regexp_keywords
=
TagRegExp
.
objects
.
values_list
(
'regexp'
,
'tag'
,
)
for
r
in
regexp_keywords
:
regexps
.
add
((
re
.
compile
(
r
[
0
]),
r
[
1
]))
suggested_regexes
=
set
()
regex_keywords
=
TagRegex
.
objects
.
all
()
# Look for our regular expressions in the content
for
r
in
regex
p
s
:
if
r
[
0
]
.
search
(
content
):
suggested_regex
ps
.
add
(
r
[
1
]
)
for
r
in
regex
_keyword
s
:
if
r
e
.
search
(
r
.
regex
,
content
):
suggested_regex
es
.
add
(
r
.
tag_id
)
return
suggested_regex
ps
return
suggested_regex
es
def
suggest_tags
(
content
=
None
):
def
suggest_tags
(
content
):
""" Suggest tags based on text content """
suggested_keywords
=
_suggest_keywords
(
content
)
suggested_regex
ps
=
_suggest_regexps
(
content
)
suggested_tag_ids
=
suggested_keywords
|
suggested_regex
p
s
suggested_regex
es
=
_suggest_regexes
(
content
)
suggested_tag_ids
=
suggested_keywords
|
suggested_regex
e
s
return
Tag
.
objects
.
filter
(
id__in
=
suggested_tag_ids
)
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