Changeset 71

Show
Ignore:
Timestamp:
06/19/07 21:42:38 (1 year ago)
Author:
pragma
Message:

Updated to cover "expert mode" requirement, as well as obeying the profile email settings.

Files:

Legend:

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

    r42 r71  
    3434-- Sequence: profile_id_seq 
    3535 
    36 /* 
     36 
    3737DROP SEQUENCE profile_id_seq; 
    3838 
     
    4343  START 1 
    4444  CACHE 1; 
    45 */ 
     45 
    4646 
    4747-- Sequence: topic_id_seq 
     
    121121-- Table: profile 
    122122 
    123 /* 
     123 
    124124DROP TABLE profile; 
    125125 
     
    137137  timezone varchar(8), 
    138138  viewemail bool DEFAULT true, 
    139   isactive bool DEFAULT false 
    140 )  
    141 WITHOUT OIDS; 
    142 */ 
     139  isactive bool DEFAULT false, 
     140  isexpert bool DEFAULT false, 
     141  posts int4 DEFAULT 0 
     142)  
     143WITHOUT OIDS; 
     144 
    143145 
    144146-- Table: topic 
     
    160162-- Table: project 
    161163 
    162 /* 
    163164DROP TABLE project; 
    164165 
     
    170171)  
    171172WITHOUT OIDS; 
    172 */ 
     173 
     174-- Table: forum_watch 
     175 
     176-- DROP TABLE forum_watch; 
     177 
     178CREATE TABLE forum_watch 
     179
     180  id serial NOT NULL, 
     181  forum_id int4, 
     182  username text 
     183)  
     184WITHOUT OIDS; 
     185ALTER TABLE forum_watch OWNER TO postgres; 
     186 
     187-- Table: topic_watch 
     188 
     189-- DROP TABLE topic_watch; 
     190 
     191CREATE TABLE topic_watch 
     192
     193  id serial NOT NULL, 
     194  topicid int4, 
     195  username text 
     196)  
     197WITHOUT OIDS; 
     198ALTER TABLE topic_watch OWNER TO postgres; 
     199 
     200-- Table: project_watch 
     201 
     202-- DROP TABLE project_watch; 
     203 
     204CREATE TABLE project_watch 
     205
     206  id serial NOT NULL, 
     207  username text, 
     208  projectid varchar(32) 
     209)  
     210WITHOUT OIDS; 
     211ALTER TABLE project_watch OWNER TO postgres; 
     212 
     213-- Table: forum_category 
     214 
     215-- DROP TABLE forum_category; 
     216 
     217CREATE TABLE forum_category 
     218
     219  id serial NOT NULL, 
     220  projectid varchar(32), 
     221  description text, 
     222  sortorder int4 DEFAULT 0 
     223)  
     224WITHOUT OIDS; 
     225ALTER TABLE forum_category OWNER TO postgres; 
  • trunk/tracforums/model.py

    r66 r71  
    1313 
    1414def toBool(obj): 
    15     if obj: return True 
     15    if obj and obj in ['1','true','True',True]: return True 
    1616    else: return False 
    17          
     17             
    1818class ISecurityContext: 
    1919    def canView(self,context): 
     
    114114         
    115115class UIContext: 
    116     def __init__(self,req,env): 
     116    def __init__(self,req,env,db): 
    117117        self.req = req 
    118118        self.env = env 
     119        self.db = db 
    119120        
    120121    def getArgs(self): 
     
    171172    def getProfilePath(self): 
    172173        return self.env.config.get("tracforums","profilepath",'/') 
     174 
     175    def forumRedirect(self,path,suffix=""): 
     176        self.db.commit() 
     177        self.req.redirect(self.req.abs_href.forums(path) + suffix) 
  • trunk/tracforums/models/avatar.py

    r65 r71  
    6464        return "avatar/edit.cs",self._getAssets(context) 
    6565         
    66     def getSaveTemplate(self,context): 
    67         return "avatar/save.cs",self._getAssets(context) 
     66    def getSaveTemplate(self,context):         
     67        from tracforums.models.profile import Profile 
     68        profile = Profile(self.db).getById(context.getAuthname(),context) 
     69         
     70        if profile['isexpert']: 
     71            context.forumRedirect("/profile/" + str(self.instance['username'])); 
     72        else:     
     73            return "avatar/save.cs",self._getAssets(context) 
    6874         
    6975    def getNewTemplate(self,context): 
  • trunk/tracforums/models/forum.py

    r68 r71  
    6464          
    6565    def getSaveTemplate(self,context): 
    66         assets = self._getDisplayAssets(context) 
    67         self.instance['descriptionhtml'] = context.wikiToOneLiner(self.instance['description']) 
    68         self.instance['hiddenhtml'] = context.boolToHTML(self.instance['hidden']) 
    69         self.instance['lockedhtml'] = context.boolToHTML(self.instance['locked']) 
    70         assets['forum'] = self.instance 
    71         return "forum/save.cs",assets 
     66        from tracforums.models.profile import Profile 
     67        profile = Profile(self.db).getById(context.getAuthname(),context) 
     68         
     69        if profile['isexpert']: 
     70            context.forumRedirect("/forum/" + str(self.instance['id'])); 
     71        else: 
     72            assets = self._getDisplayAssets(context) 
     73            self.instance['descriptionhtml'] = context.wikiToOneLiner(self.instance['description']) 
     74            self.instance['hiddenhtml'] = context.boolToHTML(self.instance['hidden']) 
     75            self.instance['lockedhtml'] = context.boolToHTML(self.instance['locked']) 
     76            assets['forum'] = self.instance    
     77            return "forum/save.cs",assets 
    7278                 
    7379    def getNewTemplate(self,context): 
     
    9298         
    9399    def getDeletedTemplate(self,context): 
    94         args = context.getArgs() 
    95         assets = self._getDisplayAssets(context) 
    96          
    97         # forward form data 
    98         selectedTopics = args['selectedTopics'] 
    99         assets['selectedTopics'] = selectedTopics 
    100          
    101         return "forum/deleted.cs", assets                
     100        from tracforums.models.profile import Profile 
     101        profile = Profile(self.db).getById(context.getAuthname(),context) 
     102         
     103        if profile['isexpert']: 
     104            context.forumRedirect("/forum/" + str(self.instance["id"])); 
     105        else: 
     106            args = context.getArgs() 
     107            assets = self._getDisplayAssets(context) 
     108             
     109            # forward form data 
     110            selectedTopics = args['selectedTopics'] 
     111            assets['selectedTopics'] = selectedTopics 
     112             
     113            return "forum/deleted.cs", assets                
    102114 
    103115    def getMoveTemplate(self,context): 
  • trunk/tracforums/models/main.py

    r68 r71  
    5353         
    5454    def getDeletedTemplate(self,context): 
    55         assets = self._getDisplayAssets(context) 
    56         args = context.getArgs() 
    57          
    58         # forward form data 
    59         selectedForums = args['selectedForums'] 
    60         assets['selectedForums'] = ','.join(selectedForums) 
     55        from tracforums.models.profile import Profile 
     56        profile = Profile(self.db).getById(context.getAuthname(),context) 
    6157         
    62         return "main/deleted.cs", assets             
     58        if profile['isexpert']: 
     59            context.forumRedirect("/main"); 
     60        else:    
     61            assets = self._getDisplayAssets(context) 
     62            args = context.getArgs() 
     63             
     64            # forward form data 
     65            selectedForums = args['selectedForums'] 
     66            assets['selectedForums'] = ','.join(selectedForums) 
     67             
     68            return "main/deleted.cs", assets             
    6369 
    6470    def getMoveTemplate(self,context): 
  • trunk/tracforums/models/message.py

    r69 r71  
    7777         
    7878    def getSaveTemplate(self,context): 
    79         assets = self._getDisplayAssets(context) 
    80                  
    81         return "message/save.cs",assets 
     79        from tracforums.models.profile import Profile 
     80        profile = Profile(self.db).getById(context.getAuthname(),context) 
     81         
     82        if profile['isexpert']: 
     83            context.forumRedirect( 
     84                "/topic/" + str(self.instance['topicid']), 
     85                "#" + str(self.instance['id']) 
     86            ); 
     87        else: 
     88            assets = self._getDisplayAssets(context) 
     89            return "message/save.cs",assets 
    8290         
    8391    def getNewTemplate(self,context): 
  • trunk/tracforums/models/profile.py

    r53 r71  
    8181        # load instance (if possible) 
    8282        cursor = self.db.cursor() 
    83         columns = ('defaultavatarid','sig','bio','username','email','regdate','lastvisit','posts') 
    84         cursor.execute( 
    85             "SELECT profile.defaultAvatarId, profile.sig, profile.bio, profile.username, profile.email, profile.regdate, profile.lastvisit, " 
    86             "(SELECT count(id) FROM message where message.author = profile.username) as posts " 
    87             "FROM profile " 
    88             "WHERE profile.username = %s", 
    89             (self.username,)) 
     83        columns = ('defaultavatarid','sig','bio','username','email','regdate','lastvisit','viewemail','isexpert','posts') 
     84        cursor.execute(""" 
     85            SELECT profile.defaultAvatarId, profile.sig, profile.bio, profile.username, profile.email, profile.regdate, profile.lastvisit, profile.viewemail, profile.isexpert, 
     86            (SELECT count(id) FROM message where message.author = profile.username) as posts 
     87            FROM profile 
     88            WHERE profile.username = %(username)s 
     89        """,{ 
     90            'username': self.username 
     91        }) 
    9092        row = cursor.fetchone() 
    9193        if row == None: 
    9294            raise TracError("profile not found") 
    9395        row = dict(zip(columns, row)) 
     96        row['viewemail'] = bool(row['viewemail']) 
     97        row['isexpert'] = bool(row['isexpert']) 
    9498        self.instance = row 
    9599                     
     
    98102         
    99103        context.setSessionVar('profile_bio_rows',args['profile_bio_rows']) 
     104         
     105        print "args: ",args 
    100106         
    101107        # populate instance with changes and fresh values   
     
    106112            'username':        self.getDefault((args,self.instance),'username',self.username), 
    107113            'email':           self.getDefault((args,self.instance),'email',''), 
    108             'viewemail':       self.getDefault((args,self.instance),'viewemail',False), 
     114            'viewemail':       toBool(self.getDefault((args,self.instance),'viewemail',False)), 
     115            'isexpert':        toBool(self.getDefault((args,self.instance),'isexpert',False)), 
    109116            'regdate':         self.getDefault((args,self.instance),'regdate',0), 
    110117            'lastvisit':       self.getDefault((args,self.instance),'lastvisit',''), 
    111118            'posts':           self.getDefault((args,self.instance),'posts','') 
    112119        } 
     120        print "instance: ",self.instance 
    113121         
    114122    def create(self,context): 
     
    116124        cursor.execute( 
    117125            "INSERT INTO profile (defaultavatarid,sig,username,email,regdate,lastvisit) " 
    118             "VALUES ($(defaultavatarid)s, %(sig)s, %(bio)s,%(username)s, %(email)s, %(regdate)s, %(lastvisit)s)", 
     126            "VALUES ($(defaultavatarid)s, %(sig)s, %(bio)s,%(username)s, %(email)s, %(regdate)s, %(lastvisit)s, %(viewemail)s, %(isexpert)s )", 
    119127            self.instance) 
    120128        self.instance["id"] = self.db.get_last_id(cursor, 'profile') 
     
    124132        cursor.execute( 
    125133            "UPDATE profile " 
    126             "SET defaultavatarid=%(defaultavatarid)s, sig=%(sig)s, bio=%(bio)s, email=%(email)s, regdate=%(regdate)s, lastvisit=%(lastvisit)s
     134            "SET defaultavatarid=%(defaultavatarid)s, sig=%(sig)s, bio=%(bio)s, email=%(email)s, regdate=%(regdate)s, lastvisit=%(lastvisit)s, viewemail=%(viewemail)s, isexpert=%(isexpert)s
    127135            "WHERE username=%(username)s", 
    128136            self.instance) 
     
    186194            return profiles 
    187195 
    188         columns = ('sig','bio','username','email','regdate','lastvisit','posts'
    189         cursor.execute(""" 
    190             SELECT profile.sig, profile.bio, profile.username, profile.email, profile.regdate, profile.lastvisit 
     196        columns = ('sig','bio','username','email','regdate','lastvisit','posts','viewemail','isexpert'
     197        cursor.execute(""" 
     198            SELECT profile.sig, profile.bio, profile.username, profile.email, profile.regdate, profile.lastvisit, profile.viewemail, profile.isexpert 
    191199            FROM profile  
    192200            ORDER BY profile.username ASC 
     
    205213    def getById(self,username,context): 
    206214        cursor = self.db.cursor() 
    207         columns = ('defaultavatarid','sig','bio','username','email','regdate','lastvisit','posts') 
    208         cursor.execute(""" 
    209             SELECT profile.defaultAvatarId, profile.sig, profile.bio, profile.username, profile.email, profile.regdate, profile.lastvisit, 
     215        columns = ('defaultavatarid','sig','bio','username','email','regdate','lastvisit','viewemail','isexpert','posts') 
     216        cursor.execute(""" 
     217            SELECT profile.defaultAvatarId, profile.sig, profile.bio, profile.username, profile.email, profile.regdate, profile.lastvisit, profile.viewemail, profile.isexpert, 
    210218            (SELECT count(id) FROM message where message.author = profile.username) as posts 
    211219            FROM profile 
  • trunk/tracforums/models/topic.py

    r70 r71  
    124124         
    125125    def getSaveTemplate(self,context): 
    126         assets = self._getDisplayAssets(context) 
    127          
    128         return "topic/save.cs",assets 
     126        from tracforums.models.profile import Profile 
     127        profile = Profile(self.db).getById(context.getAuthname(),context) 
     128         
     129        if profile['isexpert']: 
     130            context.forumRedirect("/topic/" + str(self.instance['id'])); 
     131        else: 
     132            assets = self._getDisplayAssets(context) 
     133            return "topic/save.cs",assets 
    129134         
    130135    def getNewTemplate(self,context): 
     
    151156         
    152157    def getDeletedTemplate(self,context): 
    153         assets = self._getDisplayAssets(context) 
    154         args = context.getArgs() 
    155          
    156         selectedMessages = args['selectedMessages'].split(',') 
    157          
    158         # forward form data 
    159         assets['selectedMessages'] = args['selectedMessages'] 
    160                  
    161         return "topic/deleted.cs", assets             
     158        from tracforums.models.profile import Profile 
     159        profile = Profile(self.db).getById(context.getAuthname(),context) 
     160         
     161        if profile['isexpert']: 
     162            context.forumRedirect("/topic/" + str(self.instance["id"])); 
     163        else:        
     164            assets = self._getDisplayAssets(context) 
     165            args = context.getArgs() 
     166             
     167            selectedMessages = args['selectedMessages'].split(',') 
     168             
     169            # forward form data 
     170            assets['selectedMessages'] = args['selectedMessages'] 
     171                     
     172            return "topic/deleted.cs", assets             
    162173 
    163174    def getMoveTemplate(self,context): 
     
    671682            row['canDelete'] = toBool(row['canDelete']) 
    672683            row['recentModifiedHtml'] = context.epochToDate(row['recentModified']) 
    673             row['subjecthtml'] = context.wikiToOneLiner(row['subject']) 
    674684            topics.append(row) 
    675685             
  • trunk/tracforums/templates/tracforums/main/delete.cs

    r53 r71  
    2626                 
    2727        <div class="field"> 
    28             <input type="submit" value="Delete These Topics"> 
     28            <input type="submit" value="Delete These Forums"> 
    2929        </div>       
    3030    </form> 
  • trunk/tracforums/templates/tracforums/main/recent.cs

    r70 r71  
    4141                            <td>                     
    4242                                <a href="<?cs var:trac.href.forums ?>/topic/<?cs var:topic.id ?>"> 
    43                                     <?cs var:topic.subjecthtml ?> 
     43                                    <?cs var:topic.subject ?> 
    4444                                </a>                             
    4545                            </td> 
  • trunk/tracforums/templates/tracforums/profile/edit.cs

    r52 r71  
    6262            <div class="field"> 
    6363                <label for="email">Email Address:</label> 
    64                 <input type="text" id="email" name="email" value="<?cs var:forums.profile.email?>"> 
     64                <input type="text" id="email" name="email" size="32" value="<?cs var:forums.profile.email?>"> 
     65                <select id="viewemail" name="viewemail"> 
     66                    <option value="1" <?cs if:forums.profile.viewemail == 1?>selected=""<?cs /if?>>Show My Email Address</option> 
     67                    <option value="0" <?cs if:forums.profile.viewemail == 0?>selected=""<?cs /if?>>Hide My Email Address</option> 
     68                </select>                
    6569            </div> 
    6670            <div class="field"> 
    67                 <label for="email">Display Email Address:</label> 
    68                 <input type="checkbox" id="viewemail" name="viewemail" <?cs if:forums.profile.viewemail?>checked<?cs /if?> value="true"> 
    69             </div>           
     71                <label for="email">Forum Behavior:</label> 
     72                <select id="isexpert" name="isexpert">       
     73                    <option value="0" <?cs if:forums.profile.isexpert == 0?>selected=""<?cs /if?>>Normal Mode</option> 
     74                    <option value="1" <?cs if:forums.profile.isexpert == 1?>selected=""<?cs /if?>>Expert Mode</option> 
     75                </select> 
     76            </div> 
    7077            <div class="field"> 
    7178                <label for="sig" style="float:left">Signature:</label> 
  • trunk/tracforums/templates/tracforums/profile/view.cs

    r45 r71  
    11<?cs include "tracforums/header.cs" ?> 
    22    <h1><?cs var:forums.profile.username?>'s User Profile</h1> 
    3      
    4     <?cs with:profile = forums.profile?> 
    5         <?cs include "tracforums/profile/viewProfile.cs" ?> 
    6     <?cs /with?> 
    73     
    84    <?cs if:forums.profile.canModify ?> 
     
    128            <input type='submit' value='Modify This Profile'> 
    139        </form> 
    14     <?cs /if?>      
     10    <?cs /if?> 
    1511     
     12    <?cs with:profile = forums.profile?> 
     13        <?cs include "tracforums/profile/viewProfile.cs" ?> 
     14    <?cs /with?> 
     15             
    1616    <h2>Forum Avatars</h2> 
    1717    <br> 
  • trunk/tracforums/templates/tracforums/profile/viewProfile.cs

    r52 r71  
    1010<?cs /if?> 
    1111 
    12 <h2 style="clear:both">Forum Statistics</h2> 
     12 
    1313<?cs if:profile.bio == '' && profile.defaultavatarid ?> 
    1414    <img src="<?cs var:trac.href.forums ?>/avatar/<?cs var:forums.defaultavatar.id?>" 
     
    1717        style="float:left;margin:15px"> 
    1818<?cs /if?>&nbsp;&nbsp; 
     19<div style="clear:both"> </div> 
    1920<table> 
    2021    <tr> 
     
    3132    </tr> 
    3233     
    33     <?cs if:profile.viewemail?> 
     34    <tr> 
     35        <td>Email Address:</td> 
     36        <td> 
     37            <?cs if:profile.email?> 
     38                <a href='<?cs var:profile.email?>'><?cs var:profile.email?></a> 
     39            <?cs /if?> 
     40            <?cs if:profile.viewemail == 0?> 
     41                <i>(hidden)</i> 
     42            <?cs /if?>   
     43        </td> 
     44    </tr> 
     45 
     46    <?cs if:forums.profile.canModify ?>  
    3447        <tr> 
    35             <td>Email Address:</td> 
    36             <td><a href='<?cs var:profile.email?>'><?cs var:profile.email?></a></td> 
    37         </tr> 
    38     <?cs /if?> 
     48            <td>Forum Behavior:</td> 
     49            <td> 
     50                <?cs if:forums.profile.isexpert?>Expert Mode<?cs /if?> 
     51                <?cs if:!forums.profile.isexpert?>Normal Mode<?cs /if?> 
     52            </td> 
     53        </tr>        
     54    <?cs /if?>   
     55     
    3956    <?cs if:profile.sightml?> 
    4057        <tr> 
     
    4461    <?cs /if?>       
    4562</table> 
     63 
     64 
     65<?cs if:forums.profile.canModify ?>  
     66<h2>Watched Forums</h2> 
     67 
     68<h2>Watched Threads</h2> 
     69 
     70<h2>Watched Projects</h2>    
     71<?cs /if?>       
  • trunk/tracforums/web_ui.py

    r62 r71  
    200200        req.args['authname'] = req.authname # grab authname here 
    201201 
    202         context = UIContext(req,self.env) 
    203202        db = get_forumDB(self.env) 
     203        context = UIContext(req,self.env,db)         
    204204        viewName = req.args['view'] 
    205205