tagging works
authorNick Retallack <nickretallack@gmil.com>
Sun, 4 Oct 2009 17:32:00 +0000 (10:32 -0700)
committerNick Retallack <nickretallack@gmil.com>
Sun, 4 Oct 2009 17:32:00 +0000 (10:32 -0700)
floof/controllers/art.py
floof/lib/dbhelpers.py [new file with mode: 0644]
floof/model/art.py
floof/public/layout.css
floof/templates/art/show.mako

index 6ce9762..e988c7b 100644 (file)
@@ -29,4 +29,10 @@ class ArtController(BaseController):
 
     def show(self, id):
         c.art = Art.get(id)
 
     def show(self, id):
         c.art = Art.get(id)
-        return render("/art/show.mako")
\ No newline at end of file
+        return render("/art/show.mako")
+        
+    def tag(self, id):
+        art = Art.get(id)
+        art.add_tags(request.params["tags"], c.user)
+        elixir.session.commit()
+        redirect_to(action="show", id=art.id)
\ No newline at end of file
diff --git a/floof/lib/dbhelpers.py b/floof/lib/dbhelpers.py
new file mode 100644 (file)
index 0000000..4d10030
--- /dev/null
@@ -0,0 +1,5 @@
+def find_or_create(model, **kwargs):
+    instance = model.get_by(**kwargs)
+    if not instance:
+        instance = model(**kwargs)
+    return instance
\ No newline at end of file
index 1df10cc..66cbe0b 100644 (file)
@@ -11,23 +11,77 @@ from pylons import config
 
 from floof.lib.file_storage import get_path, save_file
 
 
 from floof.lib.file_storage import get_path, save_file
 
+from floof.lib.dbhelpers import find_or_create
+
+
+
 class Art(Entity):
     title = Field(Unicode(120))
     original_filename = Field(Unicode(120))
     hash = Field(String)
 class Art(Entity):
     title = Field(Unicode(120))
     original_filename = Field(Unicode(120))
     hash = Field(String)
-    uploaded_by = ManyToOne('User')
-
-    def __init__(self, **kwargs):
-        # I wanted to check for the existence of the file, but...
-        # for some reason this FieldStorage object always conditions as falsey.
-        self.hash = save_file("art", kwargs.pop('file'))
-        super(Art, self).__init__(**kwargs)
-        # this is what super is doing, pretty much.
-        # for key, value in kwargs.items():
-        #     setattr(self, key, value)
-        
 
 
+    uploaded_by = ManyToOne('User')    
+    tags = OneToMany('Tag')
+
+    # def __init__(self, **kwargs):
+    #     # I wanted to check for the existence of the file, but...
+    #     # for some reason this FieldStorage object always conditions as falsey.
+    #     # self.hash = save_file("art", kwargs.pop('file'))
+    #     super(Art, self).__init__(**kwargs)
+    #     # this is what super is doing, pretty much.
+    #     # for key, value in kwargs.items():
+    #     #     setattr(self, key, value)
+    # left for posterity.
+
+    def set_file(self, file):
+        self.hash = save_file("art", file)
+        
+    file = property(get_path, set_file)
 
     def get_path(self):
         if self.hash:
             return get_path("art", self.hash)
 
     def get_path(self):
         if self.hash:
             return get_path("art", self.hash)
+
+
+    def add_tags(self, tags, user):
+        for tag in tags.split():
+            if len(tag) > 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=tag)
+            tag     = find_or_create(Tag, art=self, tagger=user, tagtext=tagtext)
+
+
+    def __unicode__(self):
+        return self.get_path()
+
+
+class Tag(Entity):
+    # look into how ondelete works.  It just sets a database property.
+    art = ManyToOne('Art', ondelete='cascade')
+    tagger = ManyToOne('User')
+    tagtext = ManyToOne('TagText')
+
+    # this text setter is no longer useful since I changed the way Art#add_tags works
+    # but I'll leave it in here just for several minutes nostalgia.
+    # def set_text(self, text):
+    #     self.tagtext = TagText.get_by(text=text)
+    #     if not self.tagtext:
+    #         self.tagtext = TagText(text=text)
+    #
+    # text = property(lambda self: self.tagtext.text, set_text)
+
+    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
\ No newline at end of file
index 95db22c..0f65486 100644 (file)
@@ -4,3 +4,5 @@
 #body { padding: 1em; }
 
 #footer { padding: 1em; background: #c0c0c0; }
 #body { padding: 1em; }
 
 #footer { padding: 1em; background: #c0c0c0; }
+
+.full {display:block;}
\ No newline at end of file
index 7d54f98..88e3ec9 100644 (file)
@@ -2,4 +2,15 @@
 
 <h1>View Art</h1>
 
 
 <h1>View Art</h1>
 
-<img src="${c.art.get_path()}"
\ No newline at end of file
+${h.form (h.url_for (controller='art', action='tag', id=c.art.id), multipart=True)}
+Add Some Tags: ${h.text('tags')}
+${h.submit('submit', 'Tag!')}
+${h.end_form()}
+
+% for tag in c.art.tags:
+${tag}
+% endfor
+
+
+<img class="full" src="${c.art.get_path()}">
+