Changeset 111

Show
Ignore:
Timestamp:
04/27/08 00:54:28 (7 months ago)
Author:
pragma
Message:
  • r70 migration script revised
  • tweaked schema for automated installer
  • added ORM hook for trac.db table generation
  • added calls to ORM table creation in the automated installer (not tested)
  • fixed a bug related to the calculation of 'touched' for forums
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/sql/postgres.sql

    r110 r111  
    33  id serial NOT NULL,   
    44  name text, 
    5   username varchar(32)
     5  username text NOT NULL
    66  mimetype varchar(256),   
    77  CONSTRAINT forum_pkey PRIMARY KEY (id), 
     
    5959( 
    6060  forumid int4 NOT NULL, 
    61   username varchar(25) NOT NULL 
     61  username text NOT NULL 
    6262); 
    6363 
     
    6565( 
    6666  sig text, 
    67   username varchar(25) NOT NULL, 
     67  username text NOT NULL, 
    6868  email varchar(255), 
    6969  regdate int4 NOT NULL DEFAULT 0, 
     
    116116( 
    117117  id serial NOT NULL, 
    118   username varchar(32)
     118  username text
    119119  topicid int4, 
    120120  CONSTRAINT touched_topic_pkey PRIMARY KEY (id) 
  • trunk/sql/r70migration.sql

    r110 r111  
    66 
    77ALTER TABLE project RENAME hidden TO active; 
    8  
    9 CREATE TABLE forum_category 
    10 ( 
    11   id serial NOT NULL, 
    12   projectid varchar(32), 
    13   description text, 
    14   rank serial NOT NULL, 
    15   CONSTRAINT forum_category_pkey PRIMARY KEY (id) 
    16 ); 
    17  
    18 CREATE TABLE forum_watch 
    19 ( 
    20   id serial NOT NULL, 
    21   forumid int4, 
    22   username text, 
    23   CONSTRAINT forum_watch_pkey PRIMARY KEY (id) 
    24 ); 
    25  
    26 CREATE TABLE project_watch 
    27 ( 
    28   id serial NOT NULL, 
    29   username text, 
    30   projectid varchar(32), 
    31   CONSTRAINT project_watch_pkey PRIMARY KEY (id) 
    32 ); 
    33  
    34 CREATE TABLE topic_watch 
    35 ( 
    36   id serial NOT NULL, 
    37   topicid int4, 
    38   username text, 
    39   CONSTRAINT topic_watch_pkey PRIMARY KEY (id) 
    40 ); 
    41  
    42 CREATE TABLE touched_topic 
    43 ( 
    44   id serial NOT NULL, 
    45   username varchar(32), 
    46   topicid int4, 
    47   CONSTRAINT touched_topic_pkey PRIMARY KEY (id) 
    48 ); 
  • trunk/tracforums/db.py

    r88 r111  
    3434version = 1 
    3535 
    36 #TODO: write upgrader/installer 
    37 def upgradeSchema(): 
    38     pass 
     36def upgradeSchema(db): 
     37    from tracforums.models import * 
     38     
     39    AvatarModel.createTable(db) 
     40    CategoryModel.createTable(db) 
     41    ForumModel.createTable(db) 
     42    MessageModel.createTable(db) 
     43    ModeratorModel.createTable(db) 
     44    ProfileModel.createTable(db) 
     45    ProjectModel.createTable(db) 
     46    TopicModel.createTable(db) 
     47    TouchedTopicModel.createTable(db) 
     48    ForumWatchModel.createTable(db) 
     49    TopicWatchModel.createTable(db) 
     50    ProjectWatchModel.createTable(db) 
  • trunk/tracforums/htdocs/css/forums.css

    r107 r111  
    178178.signature{ 
    179179    border-top: 1px solid #D7D7D7; 
     180    font-size: smaller; 
    180181} 
    181182 
  • trunk/tracforums/init.py

    r85 r111  
    3131        try: 
    3232            # assume nothing! 
    33             upgradeSchema(
     33            upgradeSchema(db
    3434                     
    3535            # Creation is done.  Set the version. 
  • trunk/tracforums/model.py

    r107 r111  
    88from trac.wiki import wiki_to_html, wiki_to_oneliner 
    99from trac.util.datefmt import format_datetime, format_date, pretty_timedelta 
    10  
    11 #todo: check out "The IT Crowd" on bittorrent 
    1210 
    1311class Struct: 
  • trunk/tracforums/models/avatar.py

    r105 r111  
    1515    columns   = { 
    1616        "id": ORMKey(type='int', auto_increment = True), 
    17         "username":  ORMColumn(type="str"), 
    18         "mimetype":  ORMColumn(type="str"), 
    19         "name":      ORMColumn(type="str"), 
     17        "username":  ORMColumn(type="text"), 
     18        "mimetype":  ORMColumn(type="varchar",size=256), 
     19        "name":      ORMColumn(type="text"), 
    2020        "avatarid":  ORMAlias(type="int",sql="id"), 
    2121    } 
  • trunk/tracforums/models/category.py

    r105 r111  
    1212    columns   = { 
    1313        "id":          ORMKey(type="int", auto_increment = True), 
    14         "projectid":   ORMColumn(force_insert = True), 
    15         "description": ORMColumn(type="str"), 
     14        "projectid":   ORMColumn(type="varchar",size=32,force_insert = True), 
     15        "description": ORMColumn(type="text"), 
    1616        "rank":        ORMColumn(type='int', auto_increment = True), 
    1717         
     
    5353        "forums": ORMRelation( 
    5454            model        = ORMImportModel("tracforums.models.forum","ForumModelWithRecentPost"), 
    55             relationship = {"categoryid":"categoryid"}, 
    56             debug = True 
     55            relationship = {"categoryid":"categoryid"} 
    5756        ), 
    5857    } 
  • trunk/tracforums/models/forum.py

    r109 r111  
    1616        # normal columns 
    1717        "id":          ORMKey(type="int", auto_increment = True, unique = True), 
    18         "projectid":   ORMColumn(type="str", required = True), 
    19         "name":        ORMColumn(type="str", unique = True, required = True), 
     18        "projectid":   ORMColumn(type="varchar", size=32, required = True), 
     19        "name":        ORMColumn(type="text", unique = True, required = True), 
    2020        "created":     ORMColumn(type="int"), 
    2121        "modified":    ORMColumn(type="int"), 
    22         "description": ORMColumn(type="str"),  
     22        "description": ORMColumn(type="text"),  
    2323        "locked":      ORMColumn(type="bool"), 
    2424        "hidden":      ORMColumn(type="bool"), 
     
    8585         
    8686        "touched":  ORMAlias(type="bool",sql=""" 
    87             coalesce((select true from %(touchedtopic)s as tt  
     87            coalesce((select distinct true from %(touchedtopic)s as tt  
    8888                join %(topic)s as t on tt.topicid = t.id 
    8989                where t.forumid = %(forum)s.id  
  • trunk/tracforums/models/message.py

    r105 r111  
    1818            "created":    ORMColumn(type="int"), 
    1919            "modified":   ORMColumn(type="int"), 
    20             "body":       ORMColumn(type="str"), 
    21             "author":     ORMColumn(type="str"), 
     20            "body":       ORMColumn(type="text"), 
     21            "author":     ORMColumn(type="text"), 
    2222            "avatarid":   ORMColumn(type="int"), 
    23             "modifiedby": ORMColumn(type="str"), 
     23            "modifiedby": ORMColumn(type="text"), 
    2424            "modcount":   ORMColumn(type="int"), 
    2525             
     
    5656                    %%(isuser)s 
    5757                    and coalesce(( 
    58                         select true from %(moderator)s m  
     58                        select distinct true from %(moderator)s m  
    5959                        join %(forum)s f on m.forumid = f.id 
    6060                        join %(topic)s t on f.id = t.forumid 
  • trunk/tracforums/models/moderator.py

    r97 r111  
    1111    orderby   = [("username","asc")], 
    1212    columns   = { 
    13         "forumid":  ORMColumn(type='str', force_insert=True), 
    14         "username": ORMColumn(type='str', force_insert=True) 
     13        "forumid":  ORMColumn(type='int', force_insert=True), 
     14        "username": ORMColumn(type='text', force_insert=True) 
    1515    } 
    1616) 
  • trunk/tracforums/models/profile.py

    r110 r111  
    1111    tablename = Tablenames.profile, 
    1212    columns = { 
    13         "sig": ORMColumn(), 
    14         "username": ORMColumn(), 
    15         "email": ORMColumn(), 
    16         "regdate": ORMColumn(type="int"), 
    17         "lastvisit": ORMColumn(type="int"), 
     13        "sig":             ORMColumn(type="text"), 
     14        "username":        ORMColumn(type="text"), 
     15        "email":           ORMColumn(type="text"), 
     16        "regdate":         ORMColumn(type="int"), 
     17        "lastvisit":       ORMColumn(type="int"), 
    1818        "defaultavatarid": ORMColumn(type="int"), 
    19         "bio": ORMColumn(), 
    20         "logindate": ORMColumn(type="int"), 
    21         "timezone": ORMColumn(), 
    22         "viewemail": ORMColumn(type="bool"), 
    23         "isactive": ORMColumn(type="bool"), 
    24         "isexpert": ORMColumn(type="bool"), 
    25         "posts": ORMColumn(type="int"), 
     19        "bio":             ORMColumn(type="text"), 
     20        "logindate":       ORMColumn(type="int"), 
     21        "timezone":        ORMColumn(type="varchar",size=8), 
     22        "viewemail":       ORMColumn(type="bool"), 
     23        "isactive":        ORMColumn(type="bool"), 
     24        "isexpert":        ORMColumn(type="bool"), 
     25        "posts":           ORMColumn(type="int"), 
    2626         
    2727        "profileid": ORMAlias( 
  • trunk/tracforums/models/project.py

    r85 r111  
    88    tablename=Tablenames.project, 
    99    columns={ 
    10         "id":        ORMKey(type='str'), 
    11         "name":      ORMColumn(type='str'), 
     10        "id":        ORMKey(type='varchar',size='32'), 
     11        "name":      ORMColumn(type='text'), 
    1212        "active":    ORMColumn(type='bool'),         
    1313        "projectid": ORMAlias(sql="id") 
  • trunk/tracforums/models/topic.py

    r109 r111  
    1111    columns   = { 
    1212        "id":            ORMKey(type="int", auto_increment = True), 
    13         "username":      ORMColumn(type="str", force_update = True, force_insert = True), 
     13        "username":      ORMColumn(type="text", force_update = True, force_insert = True), 
    1414        "topicid":       ORMColumn(type="int", force_update = True, force_insert = True), 
    1515    } 
     
    2222        "id":            ORMKey(type="int", auto_increment = True), 
    2323        "forumid":       ORMColumn(type="int", required = True), 
    24         "subject":       ORMColumn(type="str"), 
     24        "subject":       ORMColumn(type="text"), 
    2525        "leadmessageid": ORMColumn(type="int"), 
    2626        "views":         ORMColumn(type="int"), 
    27         "type":          ORMColumn(type="str"), 
     27        "type":          ORMColumn(type="text"), 
    2828        "topicid":       ORMAlias(type="int",sql="%(topic)s.id" % Tablenames), 
    2929         
  • trunk/tracforums/models/watch.py

    r95 r111  
    1616        "id":            ORMKey(type='int', auto_increment = True), 
    1717        "forumid":       ORMColumn(type='int'), 
    18         "username":      ORMColumn(), 
     18        "username":      ORMColumn(type="text"), 
    1919        "watchusername": ORMAlias(sql='username') 
    2020    })): 
     
    5050        "id":            ORMKey(type='int', auto_increment = True), 
    5151        "topicid":       ORMColumn(type='int'), 
    52         "username":      ORMColumn(), 
     52        "username":      ORMColumn(type="text"), 
    5353        "watchusername": ORMAlias(sql='username'), 
    5454         
     
    8989    columns={ 
    9090        "id":            ORMKey(type='int', auto_increment = True), 
    91         "projectid":     ORMColumn(type='str'), 
    92         "username":      ORMColumn(), 
     91        "projectid":     ORMColumn(type='varchar',size=32), 
     92        "username":      ORMColumn(type="text"), 
    9393        "watchusername": ORMAlias(sql='username') 
    9494    })): 
  • trunk/tracforums/orm.py

    r109 r111  
    203203         
    204204    @staticmethod 
    205     def getByType(name): 
    206         if name: 
    207             return getattr(Format,name,Format.noFormat) 
     205    def getByType(type): 
     206        if type: 
     207            if type == "varchar" or type == "text": 
     208                return Format.str 
     209            else: 
     210                return getattr(Format,type,Format.noFormat) 
    208211        return Format.noFormat 
    209212         
     
    248251class ORMColumn:     
    249252    def __init__(self,  
    250         type           = None,  
     253        type           = None, 
    251254        size           = None,  
    252255        unique         = False, 
     
    269272        self.validator = validator 
    270273        self.formatter = formatter 
    271                  
     274         
    272275        if type: 
    273276            if not validator: 
    274277                self.validator = Validate.getByType(type) 
    275278            if not formatter: 
    276                 self.formatter = Format.getByType(type) 
     279                self.formatter = Format.getByType(type)                
    277280                 
    278281        if not validator: 
     
    642645            rows = cursor.fetchall() 
    643646            for row in rows: 
    644                return row[0] 
     647                return row[0] 
    645648            return 0 
    646649             
     
    820823            if reasons and len(reasons) > 0: 
    821824                raise ModelValidateException(reasons) 
    822                  
    823         #TODO: finish me 
    824         def createTable(self): 
    825             coldefs = []             
    826             for fieldname in self.schema.columns: 
    827                 col = self.schema.columns[fieldname] 
    828                 coldefs.append(col.name + " " + col.type + ",") 
    829                  
    830             return "create table " + self.schema.tablename + " (" + coldefs.join(",") + ")" 
     825                         
     826        @staticmethod 
     827        def createTable(db,debug=False): 
     828            """ 
     829                Provides a bridge from the ORM to the trac db scheme for table generation 
     830            """ 
     831            from trac.db import Table, Column 
     832             
     833            schema = _ORMSchemaData() 
     834            tracTable = Table(schema.tablename) 
     835                        
     836            for fieldname in schema.columns: 
     837                col = schema.columns(fieldname) 
     838                if isinstance(col,ORMAlias): 
     839                    pass 
     840                elif isinstance(col,ORMJoin): 
     841                    pass 
     842                elif isinstance(col,ORMRelation): 
     843                    pass 
     844                elif isinstance(col,ORMKey): 
     845                    tracTable.columns.append(Column(col.name,col.type,col.size,col.unique,col.auto_increment))                    
     846                    tracTable.keys.append(col.name) 
     847                elif isinstance(col,ORMColumn): 
     848                    tracTable.columns.append(Column(col.name,col.type,col.size,col.unique,col.auto_increment))                    
     849                     
     850            db.cursor().execute(db.to_sql(tracTable)) 
     851            db.commit() 
    831852 
    832853    return _ORMSchemaModel 
  • trunk/tracforums/templates/tracforums/profile/watches.cs

    r109 r111  
    1010    </div> 
    1111    <br> 
    12              
     12                
    1313    <div class="instructions"> 
    14         <?cs if:len(forums.forums) == 0?> 
     14        <?cs if:len(forums.projects) != 0 && len(forums.watchedForums) != 0 && len(forums.watchedTopics) != 0?> 
    1515            <p>Here you may review and remove your watch entries.</p> 
    1616        <?cs /if?> 
     17        <?cs if:len(forums.projects) == 0 && len(forums.watchedForums) == 0 && len(forums.watchedTopics) == 0?> 
     18            <p>There are no watches to display.</p> 
     19        <?cs /if?>       
    1720        <?cs if:len(forums.validateErrors) > 0?> 
    1821            <?cs each:err = forums.validateErrors?>