2 # floof/floof/model/art.py
4 # Copyright (c) 2009 Scribblr
7 # from elixir import Entity, Field, Integer, Unicode
11 from pylons
import config
13 from floof
.lib
.file_storage
import get_path
, save_file
14 from floof
.lib
.dbhelpers
import find_or_create
, update_or_create
17 title
= Field(Unicode(120))
18 original_filename
= Field(Unicode(120))
19 hash = Field(String
, unique
=True, required
=True)
21 uploader
= ManyToOne('User', required
=True)
22 tags
= OneToMany('Tag')
24 def set_file(self
, file):
25 self
.hash = save_file("art", file)
26 self
.original_filename
= file.filename
28 file = property(get_path
, set_file
)
32 return get_path("art", self
.hash)
35 def add_tags(self
, tags
, user
):
36 for text
in tags
.split():
39 tagtext
= TagText
.get_by(text
=text
[1:])
41 tag
= Tag
.get_by(art
=self
, tagger
=user
, tagtext
=tagtext
)
43 elixir
.session
.delete(tag
)
47 raise "Long Tag!" # can we handle this more gracefully?
48 # sqlite seems happy to store strings much longer than the supplied limit...
50 # elixir should really have its own find_or_create.
51 tagtext
= find_or_create(TagText
, text
=text
)
52 tag
= find_or_create(Tag
, art
=self
, tagger
=user
, tagtext
=tagtext
)
57 def rate(self
, score
, user
):
58 return update_or_create(Rating
, {"rater":user
, "art":self
}, {"score":score
})
60 def user_score(self
, user
):
61 rating
= Rating
.get_by(rater
=user
, art
=self
)
66 def __unicode__(self
):
67 return self
.get_path()
71 # look into how ondelete works. This just sets a database property.
72 art
= ManyToOne('Art', ondelete
='cascade')
73 tagger
= ManyToOne('User', ondelete
='cascade')
74 tagtext
= ManyToOne('TagText')
76 def __unicode__(self
):
79 return unicode(self
.tagtext
)
82 class TagText(Entity
):
83 text
= Field(Unicode(50)) # gotta enforce this somehow
84 tags
= OneToMany('Tag')
86 def __unicode__(self
):
91 art
= ManyToOne('Art', ondelete
='cascade')
92 rater
= ManyToOne('User', ondelete
='cascade')
93 score
= Field(Integer
)
95 options
= {-1:"sucks", 0:"undecided", 1:"good", 2:"great"}
99 Rating
.reverse_options
= dict (zip(Rating
.options
.values(), Rating
.options
.keys()))