fixed search query (awesome now thanks vee =]), tag links, default routing is back...
authorNick Retallack <nickretallack@gmil.com>
Mon, 5 Oct 2009 17:37:50 +0000 (10:37 -0700)
committerNick Retallack <nickretallack@gmil.com>
Mon, 5 Oct 2009 17:37:50 +0000 (10:37 -0700)
1  2 
floof/config/routing.py
floof/controllers/art.py
floof/controllers/search.py
floof/model/art.py
floof/public/layout.css
floof/templates/art/show.mako

@@@ -25,13 -25,8 +25,18 @@@ def make_map()
      map.connect('/account/login', controller='account', action='login')
      map.connect('/account/login_begin', controller='account', action='login_begin', **require_POST)
      map.connect('/account/login_finish', controller='account', action='login_finish')
 +    map.connect('/account/logout', controller='account', action='logout', **require_POST)
 +    map.connect('/account/register', controller='account', action='register')
 +    map.connect('/account/register_finish', controller='account', action='register_finish', **require_POST)
  
 +    map.connect('/users', controller='users', action='list')
 +    map.connect('/users/{name}', controller='users', action='view')
 +
 +    map.connect('/search', controller='search', action='index')
 +
++    # default routing is back so we can test stuff.
++    # please don't take it away until we have some more core features in.
+     map.connect('/{controller}/{action}')
+     map.connect('/{controller}/{action}/{id}')
      return map
Simple merge
@@@ -13,16 -13,43 +13,16 @@@ import elixi
  class SearchController(BaseController):
  
      def index(self):
 -        # Return a rendered template
 -        #return render('/search.mako')
 -        # or, return a response
 -        return 'Hello World'
 -
 -    def results(self):
 -        """ Search, implemented the stupid way! """
 -        query = request.params.get('query','')
 -        words = query.split()
 +        """Search, implemented the stupid way!"""
 +        query = request.params.get('query', '')
 +        tags = query.split()
+         
 -        tags = []
 -        for word in words:
 -            components = word.split(':')
 -            if len(components) == 1:
 -                # tags are plain.
 -                tags.append(word)
 -            elif components[0] == "rating":
 -                if components[1].isnumeric():
 -                    score = int(components[1])
 -                else:
 -                    score = Rating.reverse_options.get(components[1])
 -                
 -                if -1 <= score <= 3:
 -                    pass
 -                    # TODO: Find stuff that has this rating
 -                    # Rating.query.filter(Rating.s)
 -                
 -                
 -        
 -
          tagtexts = TagText.query.filter(TagText.text.in_(tags))
 -        tagtext_ids = map(lambda x:x.id, tagtexts)
 +        tagtext_ids = [_.id for _ in tagtexts]
 +
 +        # Fetch art that has all the tags
 +        c.artwork = Art.query.join(Tag) \
-                        .filter(Tag.id.in_(tagtext_ids)) \
++                       .filter(Tag.tagtext_id.in_(tagtext_ids)) \
 +                       .all()
  
-         return render('/index.mako')
 -        # TODO: this is wrong.  Please fix it so it returns art that has all the tags.
 -        art_tag_pairs = elixir.session.query(Art,Tag).filter(Art.id == Tag.art_id).\
 -            filter(Tag.tagtext_id.in_(tagtext_ids)).all()
 -        
 -        # just the art please.
 -        c.artwork = map(lambda x: x[0], art_tag_pairs)
+         return render('/index.mako')
@@@ -11,9 -11,9 +11,8 @@@ import elixi
  from pylons import config
  
  from floof.lib.file_storage import get_path, save_file
- from floof.lib.dbhelpers import find_or_create
+ from floof.lib.dbhelpers import find_or_create, update_or_create
  
 -
  class Art(Entity):
      title = Field(Unicode(120))
      original_filename = Field(Unicode(120))
@@@ -57,8 -57,8 +56,6 @@@
                      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)
@@@ -92,6 -103,19 +100,19 @@@ class Tag(Entity)
  class TagText(Entity):
      text = Field(Unicode(50)) # gotta enforce this somehow
      tags = OneToMany('Tag')
 -    
 +
      def __unicode__(self):
-         return self.text
+         return self.text
+         
+ class Rating(Entity):
+     art = ManyToOne('Art', ondelete='cascade')
+     rater = ManyToOne('User', ondelete='cascade')
+     score = Field(Integer)
+         
+     options = {-1:"sucks", 0:"undecided", 1:"good", 2:"great"}
+     default = 0
+     # options = ["sucks","neutral","good","great"]
+     
+ Rating.reverse_options = dict (zip(Rating.options.values(), Rating.options.keys()))
@@@ -9,15 -6,4 +9,14 @@@ body { font-family: sans-serif; font-si
  #footer { padding: 1em; background: #c0c0c0; }
  
  .full {display:block;}
 -.selected {color:red;}
 +
 +/*** Common bits and pieces ***/
 +/* General form layout */
 +dl.form { margin: 1em 0; padding-left: 1em; border-left: 0.5em solid gray; }
 +dl.form dt { padding-bottom: 0.25em; font-style: italic; }
 +dl.form dd { margin-bottom: 0.5em; }
 +
 +
 +
 +/*** Individual page layout ***/
++.selected {color:red;}
@@@ -9,9 -11,17 +11,17 @@@ ${h.end_form()
  
  % for tag in c.art.tags:
  <a href="${h.url_for (controller='tag', action='delete', id=tag.id)}">x</a> 
--<a href="${h.url_for (controller='search', action='results')}?query=${tag}">${tag}</a>
++<a href="${h.url_for (controller='search', action='index')}?query=${tag}">${tag}</a>
  % endfor
  
+ What do you think?
+ % for score,text in sorted(Rating.options.items()):
+ <a href="${h.url_for(controller='art', action='rate', id=c.art.id)}?score=${score}" \
+ % if c.your_score == score:
+ class="selected" \
+ % endif
+ >${text}</a> 
+ % endfor
  
  <img class="full" src="${c.art.get_path()}">