Changeset 112

Show
Ignore:
Timestamp:
04/28/08 22:02:25 (7 months ago)
Author:
pragma
Message:
  • Cascading deletion of categories, forums, topics, messages and watches
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/tracforums/models/category.py

    r111 r112  
    88 
    99class CategoryModel(ORMSchema( 
    10    tablename = Tablenames.category, 
    11    orderby   = [("rank","asc")], 
    12    columns   = { 
    13        "id":          ORMKey(type="int", auto_increment = True), 
    14        "projectid":   ORMColumn(type="varchar",size=32,force_insert = True), 
    15        "description": ORMColumn(type="text"), 
    16        "rank":        ORMColumn(type='int', auto_increment = True), 
    17         
    18        # aliases 
    19        "categoryid":  ORMAlias(sql='id'), 
    20        "descriptionhtml":   ORMAlias( 
    21            name="description", 
    22            type="wiki" 
    23        ), 
    24    })): 
    25          
     10    tablename = Tablenames.category, 
     11    orderby   = [("rank","asc")], 
     12    columns   = { 
     13        "id":          ORMKey(type="int", auto_increment = True), 
     14        "projectid":   ORMColumn(type="varchar",size=32,force_insert = True), 
     15        "description": ORMColumn(type="text"), 
     16        "rank":        ORMColumn(type='int', auto_increment = True), 
     17         
     18        # aliases 
     19        "categoryid":  ORMAlias(sql='id'), 
     20        "descriptionhtml":   ORMAlias( 
     21            name="description", 
     22            type="wiki" 
     23        ), 
     24    })): 
     25          
    2626    def demoteRank(self): 
    2727        # increase rank value to lower it's priority in the list 
     
    4747            self.rank = ranks[idx-1] 
    4848             
     49             
     50    def deleteMany(self,query): 
     51        categoryIds = query.get("id") 
     52         
     53        if categoryIds == None: 
     54            categoryIds = self.getBase().getColumnValues("id",query) 
     55            if len(categoryIds) == 0: return 
     56 
     57        from tracforums.models.forum import ForumModel 
     58        ForumModel(self.db,self).deleteMany({"categoryid":categoryIds}) 
     59         
     60        self.getBase().deleteMany(self,query) 
     61                           
     62    def delete(self,data={}):         
     63        from tracforums.models.forum import ForumModel 
     64        ForumModel(self.db,self).deleteMany({"categoryid":self.id}) 
     65         
     66        self.getBase().delete(self,data) 
     67         
     68             
    4969 
    5070CategoryModelWithForums = ORMSchema( 
  • trunk/tracforums/models/forum.py

    r111 r112  
    197197            self.updateMany({"rank":ranks[idx-1]},{"rank":self.rank}) 
    198198            self.rank = ranks[idx-1] 
     199             
     200    def deleteMany(self,query): 
     201        forumIds = query.get("id",query.get("forumid")) 
     202         
     203        print 'forumIds',forumIds,query 
     204         
     205        if forumIds == None: 
     206            forumIds = self.getBase().getColumnValues(self,"id",query) 
     207            if len(forumIds) == 0: return 
     208 
     209        from tracforums.models.topic import TopicModel 
     210        TopicModel(self.db,self).deleteMany({"forumid":forumIds}) 
     211         
     212        from tracforums.models.watch import ForumWatchModel 
     213        ForumWatchModel(self.db,self).deleteMany({"forumid":forumIds}) 
     214         
     215        self.getBase().deleteMany(self,query) 
     216     
     217    def delete(self,data={}):         
     218        from tracforums.models.topic import TopicModel 
     219        TopicModel(self.db,self).deleteMany({"forumid":self.id}) 
     220         
     221        from tracforums.models.watch import ForumWatchModel 
     222        ForumWatchModel(self.db,self).deleteMany({"forumid":self.id}) 
     223         
     224        self.getBase().delete(self,data) 
    199225             
    200226             
  • trunk/tracforums/models/main.py

    r109 r112  
    8181         
    8282        from tracforums.models.forum import ForumModel 
     83        from tracforums.models.topic import TopicModel 
     84        from tracforums.models.message import MessageModel 
    8385        from tracforums.models.category import CategoryModel 
    8486 
     
    157159                if len(selectedForums) > 0: 
    158160                    ForumModel(self.db,self).deleteMany({"id":selectedForums,"projectid":self.getProjectId()}) 
     161                     
    159162                if len(selectedCategories) > 0: 
    160                     CategoryModel(self.db,self).deleteMany({"id":selectedCategories,"projectid":self.getProjectId()}) 
     163                    CategoryModel(self.db,self).deleteMany({"id":selectedCategories,"projectid":self.getProjectId()})                   
    161164                                     
    162165            elif action == "coalesceForums": 
  • trunk/tracforums/models/message.py

    r111 r112  
    106106        elif self.formatContext.getAuthname() == self.author: return True 
    107107        else: return self.formatContext.getAuthname() in self.topic.forum.moderators 
    108                 
     108 
     109                 
    109110 
    110111class MessageModelWithProfile(ORMSchema( 
  • trunk/tracforums/models/topic.py

    r111 r112  
    148148        notifyTopicChanged(self.db,self.formatContext,self) 
    149149        self.save(data) 
    150      
     150                 
     151    def deleteMany(self,query): 
     152        topicIds = query.get("id",query.get("topicid")) 
     153         
     154        if topicIds == None:             
     155            topicIds = self.getBase().getColumnValues(self,"id",query) 
     156            if len(topicIds) == 0: return 
     157 
     158        from tracforums.models.message import MessageModel 
     159        MessageModel(self.db,self).deleteMany({"topicid":topicIds}) 
     160         
     161        from tracforums.models.watch import TopicWatchModel 
     162        TopicWatchModel(self.db,self).deleteMany({"topicid":topicIds})         
     163         
     164        self.getBase().deleteMany(self,query) 
     165             
     166    def delete(self,data={}):         
     167        from tracforums.models.message import MessageModel 
     168        MessageModel(self.db,self).deleteMany({"topicid":self.id}) 
     169         
     170        from tracforums.models.watch import TopicWatchModel 
     171        TopicWatchModel(self.db,self).deleteMany({"topicid":self.id})    
     172         
     173        self.getBase().delete(self,data) 
    151174         
    152175ProjectCorrelatedTopicModel = ORMSchema( 
  • trunk/tracforums/orm.py

    r111 r112  
    8080        for i in range(0,len(part)): 
    8181            keyname = prefix + parentKey +  str(i) 
    82             termValues[keyname] = val[i] 
     82            termValues[keyname] = part[i] 
    8383            listterms.append(parentKey + " = %(" + keyname + ")s") 
     84             
    8485        termSQL += "(" + " or ".join(listterms) + ")" 
    8586         
     
    656657            if len(querySql) > 0: querySql = " where " + querySql 
    657658             
    658             selectSQL = None 
    659             col = self.schema.columns[columnName] 
    660             if isinstance(col,ORMAlias): 
    661                 selectSQL = "select (" + col.sql + ") as " + columnName + " from " + self.schema.tablename 
    662             elif isinstance(col,ORMRelation): 
    663                 #TODO: support 
    664                 pass 
    665             elif isinstance(col,ORMJoin): 
    666                 #TODO: support 
    667                 #selectSQL = "select * from (" col.left ") as " + col.joinType +  
    668                 #           " join select * from (" col.right ") as asdfj on "  
    669                 pass 
    670             elif isinstance(col,ORMColumn): 
    671                 selectSQL = "select " + columnName + " from " + self.schema.tablename 
    672                      
    673             if selectSQL: 
    674                 ###print "\ngetColumnValues",selectSQL + querySql + self.schema.orderbySQL 
    675                 cursor.execute(selectSQL + querySql + self.schema.orderbySQL,queryData) 
     659            selectColumns = [] 
     660            relevantColumns = [] 
     661            relevantColumns.append(columnName)     
     662             
     663            # get the column names from the query 
     664            for key in query: 
     665                if not key in relevantColumns: 
     666                    relevantColumns.append(key) 
     667             
     668            # gather up the columns and aliases 
     669            for key in relevantColumns: 
     670                col = self.schema.columns[key] 
     671                if isinstance(col,ORMAlias): 
     672                    selectColumns.append("(" + col.sql + ") as " + key) 
     673                elif isinstance(col,ORMRelation): 
     674                    #TODO: support 
     675                    pass 
     676                elif isinstance(col,ORMJoin): 
     677                    #TODO: support 
     678                    #selectSQL = "select * from (" col.left ") as " + col.joinType +  
     679                    #           " join select * from (" col.right ") as asdfj on "  
     680                    pass 
     681                elif isinstance(col,ORMColumn): 
     682                    selectColumns.append(columnName) 
     683                          
     684            # generate the SQL and execute 
     685            if len(selectColumns) > 0: 
     686                selectSQL = "select " + ", ".join(selectColumns) + " from " + self.schema.tablename 
    676687             
    677688                if limit > 0: 
    678                     rows = cursor.fetchmany(limit) 
    679                 else: 
    680                     rows = cursor.fetchall() 
    681              
     689                   selectSQL += " limit " + str(limit) 
     690                    
     691                #print "\ngetColumnValues",selectSQL + querySql,queryData 
     692                cursor.execute(selectSQL + querySql,queryData) 
     693                rows = cursor.fetchall() 
     694                #print rows 
    682695                return map(lambda x:x[0],rows) 
    683696            return [] 
     
    698711            cursor.execute("update " + self.schema.tablename + updateSql + querySql,queryData)  
    699712             
    700         def deleteMany(self,query): 
     713        def deleteMany(self,query,debug=False): 
    701714            cursor = self.db.cursor() 
    702715            (querySql,queryData) = getSqlTerm(self.db,query) 
    703716            querySql = " where " + querySql 
    704717             
    705             #print self.schema.deleteSQL + querySql,queryData 
     718            if debug: print self.schema.deleteSQL + querySql,queryData 
    706719             
    707720            cursor.execute(self.schema.deleteSQL + querySql,queryData)   
     
    729742                val = self.get(name) 
    730743                if val != None: 
    731                     selectValues.append(name + " = %(" + name + ")s")                     
     744                    selectValues.append(name + " = %(" + name + ")s")                
    732745             
    733746            if debug: print("selectValues:",self,selectValues,self.schema.columnNames)