Author: andrej
Date: Fri Apr 26 12:16:31 2013
New Revision: 1476161

URL: http://svn.apache.org/r1476161
Log:
fixing auto_inc_fields behaviour, adding ORDER BY feature to model select 
function

Modified:
    bloodhound/trunk/bloodhound_dashboard/bhdashboard/model.py

Modified: bloodhound/trunk/bloodhound_dashboard/bhdashboard/model.py
URL: 
http://svn.apache.org/viewvc/bloodhound/trunk/bloodhound_dashboard/bhdashboard/model.py?rev=1476161&r1=1476160&r2=1476161&view=diff
==============================================================================
--- bloodhound/trunk/bloodhound_dashboard/bhdashboard/model.py (original)
+++ bloodhound/trunk/bloodhound_dashboard/bhdashboard/model.py Fri Apr 26 
12:16:31 2013
@@ -158,21 +158,32 @@ class ModelBase(object):
             raise TracError('%(object_name)s %(keys)s already exists 
%(values)s' %
                             sdata)
             
+        auto_inc =  self._meta.get('auto_inc_fields', [])
         for key in self._meta['key_fields']:
-            if self._data[key] is None:
+            if self._data[key] is None and key not in auto_inc:
                 sdata = {'key':key}
                 sdata.update(self._meta)
                 raise TracError('%(key)s required for %(object_name)s' %
                                 sdata)
-        fields = self._meta['key_fields']+self._meta['non_key_fields']
+
+        auto_inc =  self._meta.get('auto_inc_fields', [])
+        non_auto_increment_key_fields = [
+            field for field in self._meta['key_fields']
+            if field not in auto_inc]
+        fields = non_auto_increment_key_fields + self._meta['non_key_fields']
         sdata = {'fields':','.join(fields),
                  'values':','.join(['%s'] * len(fields))}
         sdata.update(self._meta)
-        
+
         sql = """INSERT INTO %(table_name)s (%(fields)s)
                  VALUES (%(values)s)""" % sdata
         with self._env.db_transaction as db:
-            db(sql, [self._data[f] for f in fields])
+            cursor = db.cursor()
+            cursor.execute(sql, [self._data[f] for f in fields])
+            for auto_in_field in auto_inc:
+                self._data[auto_in_field] = db.get_last_id(
+                    cursor, sdata["table_name"], auto_in_field)
+
             self._exists = True
             self._old_data.update(self._data)
             TicketSystem(self._env).reset_ticket_fields()
@@ -216,10 +227,13 @@ class ModelBase(object):
 
         ResourceSystem(self._env).resource_changed(self, old_values)
 
-    
     @classmethod
-    def select(cls, env, db=None, where=None, limit=None):
-        """Query the database to get a set of records back"""
+    def select(cls, env, db=None, where=None, limit=None, order_by=None):
+        """
+        Query the database to get a set of records back
+        * order_by: is list of fields with optional sort direction
+            ("asc" or "desc") e.g. ["field1", "field2 desc"]
+        """
         rows = []
         fields = cls._meta['key_fields']+cls._meta['non_key_fields']
         
@@ -229,11 +243,13 @@ class ModelBase(object):
         wherestr, values = dict_to_kv_str(where)
         if wherestr:
             wherestr = ' WHERE ' + wherestr
+        final_sql = sql + wherestr
         if limit is not None:
-            limitstr = ' LIMIT ' + str(int(limit))
-        else:
-            limitstr = ''
-        for row in env.db_query(sql + wherestr + limitstr, values):
+            final_sql += ' LIMIT ' + str(int(limit))
+        final_sql
+        if order_by:
+            final_sql += "\nORDER BY " + ', '.join(order_by)
+        for row in env.db_query(final_sql, values):
             # we won't know which class we need until called
             model = cls.__new__(cls)
             data = dict([(fields[i], row[i]) for i in range(len(fields))])


Reply via email to