X-Git-Url: http://git.veekun.com/zzz-floof.git/blobdiff_plain/5a8f3bd86e5fbcdd1ae077b15c17a66de14c091e..da9dc9c1a060be8de3c13fa308a047b4b57eaaeb:/floof/model/tags.py diff --git a/floof/model/tags.py b/floof/model/tags.py new file mode 100644 index 0000000..1a41278 --- /dev/null +++ b/floof/model/tags.py @@ -0,0 +1,46 @@ +from elixir import * +from art import Art +from floof.lib.dbhelpers import find_or_create, update_or_create + + +class Tag(Entity): + # look into how ondelete works. This just sets a database property. + art = ManyToOne('Art', ondelete='cascade') + tagger = ManyToOne('User', ondelete='cascade') + tagtext = ManyToOne('TagText') + + def __unicode__(self): + if not self.tagtext: + return "(broken)" + return unicode(self.tagtext) + + +class TagText(Entity): + text = Field(Unicode(50)) # gotta enforce this somehow + tags = OneToMany('Tag') + + def __unicode__(self): + return self.text + + +class TagMixin(object): + def add_tags(self, tags, user): + for text in tags.split(): + if text[0] == '-': + # Nega-tags + tagtext = TagText.get_by(text=text[1:]) + if tagtext: + tag = Tag.get_by(art=self, tagger=user, tagtext=tagtext) + if tag: + elixir.session.delete(tag) + + else: + if len(text) > 50: + raise "Long Tag!" # can we handle this more gracefully? + # sqlite seems happy to store strings much longer than the supplied limit... + + # elixir should really have its own find_or_create. + tagtext = find_or_create(TagText, text=text) + tag = find_or_create(Tag, art=self, tagger=user, tagtext=tagtext) + +Art.__bases__ += (TagMixin, )