Changeset 71
- Timestamp:
- 06/19/07 21:42:38 (1 year ago)
- Files:
-
- trunk/sql/postgres.sql (modified) (6 diffs)
- trunk/tracforums/model.py (modified) (3 diffs)
- trunk/tracforums/models/avatar.py (modified) (1 diff)
- trunk/tracforums/models/forum.py (modified) (2 diffs)
- trunk/tracforums/models/main.py (modified) (1 diff)
- trunk/tracforums/models/message.py (modified) (1 diff)
- trunk/tracforums/models/profile.py (modified) (7 diffs)
- trunk/tracforums/models/topic.py (modified) (3 diffs)
- trunk/tracforums/templates/tracforums/main/delete.cs (modified) (1 diff)
- trunk/tracforums/templates/tracforums/main/recent.cs (modified) (1 diff)
- trunk/tracforums/templates/tracforums/profile/edit.cs (modified) (1 diff)
- trunk/tracforums/templates/tracforums/profile/view.cs (modified) (2 diffs)
- trunk/tracforums/templates/tracforums/profile/viewProfile.cs (modified) (4 diffs)
- trunk/tracforums/web_ui.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/sql/postgres.sql
r42 r71 34 34 -- Sequence: profile_id_seq 35 35 36 /* 36 37 37 DROP SEQUENCE profile_id_seq; 38 38 … … 43 43 START 1 44 44 CACHE 1; 45 */ 45 46 46 47 47 -- Sequence: topic_id_seq … … 121 121 -- Table: profile 122 122 123 /* 123 124 124 DROP TABLE profile; 125 125 … … 137 137 timezone varchar(8), 138 138 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 ) 143 WITHOUT OIDS; 144 143 145 144 146 -- Table: topic … … 160 162 -- Table: project 161 163 162 /*163 164 DROP TABLE project; 164 165 … … 170 171 ) 171 172 WITHOUT OIDS; 172 */ 173 174 -- Table: forum_watch 175 176 -- DROP TABLE forum_watch; 177 178 CREATE TABLE forum_watch 179 ( 180 id serial NOT NULL, 181 forum_id int4, 182 username text 183 ) 184 WITHOUT OIDS; 185 ALTER TABLE forum_watch OWNER TO postgres; 186 187 -- Table: topic_watch 188 189 -- DROP TABLE topic_watch; 190 191 CREATE TABLE topic_watch 192 ( 193 id serial NOT NULL, 194 topicid int4, 195 username text 196 ) 197 WITHOUT OIDS; 198 ALTER TABLE topic_watch OWNER TO postgres; 199 200 -- Table: project_watch 201 202 -- DROP TABLE project_watch; 203 204 CREATE TABLE project_watch 205 ( 206 id serial NOT NULL, 207 username text, 208 projectid varchar(32) 209 ) 210 WITHOUT OIDS; 211 ALTER TABLE project_watch OWNER TO postgres; 212 213 -- Table: forum_category 214 215 -- DROP TABLE forum_category; 216 217 CREATE TABLE forum_category 218 ( 219 id serial NOT NULL, 220 projectid varchar(32), 221 description text, 222 sortorder int4 DEFAULT 0 223 ) 224 WITHOUT OIDS; 225 ALTER TABLE forum_category OWNER TO postgres; trunk/tracforums/model.py
r66 r71 13 13 14 14 def toBool(obj): 15 if obj : return True15 if obj and obj in ['1','true','True',True]: return True 16 16 else: return False 17 17 18 18 class ISecurityContext: 19 19 def canView(self,context): … … 114 114 115 115 class UIContext: 116 def __init__(self,req,env ):116 def __init__(self,req,env,db): 117 117 self.req = req 118 118 self.env = env 119 self.db = db 119 120 120 121 def getArgs(self): … … 171 172 def getProfilePath(self): 172 173 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 64 64 return "avatar/edit.cs",self._getAssets(context) 65 65 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) 68 74 69 75 def getNewTemplate(self,context): trunk/tracforums/models/forum.py
r68 r71 64 64 65 65 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 72 78 73 79 def getNewTemplate(self,context): … … 92 98 93 99 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 102 114 103 115 def getMoveTemplate(self,context): trunk/tracforums/models/main.py
r68 r71 53 53 54 54 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) 61 57 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 63 69 64 70 def getMoveTemplate(self,context): trunk/tracforums/models/message.py
r69 r71 77 77 78 78 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 82 90 83 91 def getNewTemplate(self,context): trunk/tracforums/models/profile.py
r53 r71 81 81 # load instance (if possible) 82 82 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 }) 90 92 row = cursor.fetchone() 91 93 if row == None: 92 94 raise TracError("profile not found") 93 95 row = dict(zip(columns, row)) 96 row['viewemail'] = bool(row['viewemail']) 97 row['isexpert'] = bool(row['isexpert']) 94 98 self.instance = row 95 99 … … 98 102 99 103 context.setSessionVar('profile_bio_rows',args['profile_bio_rows']) 104 105 print "args: ",args 100 106 101 107 # populate instance with changes and fresh values … … 106 112 'username': self.getDefault((args,self.instance),'username',self.username), 107 113 '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)), 109 116 'regdate': self.getDefault((args,self.instance),'regdate',0), 110 117 'lastvisit': self.getDefault((args,self.instance),'lastvisit',''), 111 118 'posts': self.getDefault((args,self.instance),'posts','') 112 119 } 120 print "instance: ",self.instance 113 121 114 122 def create(self,context): … … 116 124 cursor.execute( 117 125 "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 )", 119 127 self.instance) 120 128 self.instance["id"] = self.db.get_last_id(cursor, 'profile') … … 124 132 cursor.execute( 125 133 "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 " 127 135 "WHERE username=%(username)s", 128 136 self.instance) … … 186 194 return profiles 187 195 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 191 199 FROM profile 192 200 ORDER BY profile.username ASC … … 205 213 def getById(self,username,context): 206 214 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, 210 218 (SELECT count(id) FROM message where message.author = profile.username) as posts 211 219 FROM profile trunk/tracforums/models/topic.py
r70 r71 124 124 125 125 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 129 134 130 135 def getNewTemplate(self,context): … … 151 156 152 157 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 162 173 163 174 def getMoveTemplate(self,context): … … 671 682 row['canDelete'] = toBool(row['canDelete']) 672 683 row['recentModifiedHtml'] = context.epochToDate(row['recentModified']) 673 row['subjecthtml'] = context.wikiToOneLiner(row['subject'])674 684 topics.append(row) 675 685 trunk/tracforums/templates/tracforums/main/delete.cs
r53 r71 26 26 27 27 <div class="field"> 28 <input type="submit" value="Delete These Topics">28 <input type="submit" value="Delete These Forums"> 29 29 </div> 30 30 </form> trunk/tracforums/templates/tracforums/main/recent.cs
r70 r71 41 41 <td> 42 42 <a href="<?cs var:trac.href.forums ?>/topic/<?cs var:topic.id ?>"> 43 <?cs var:topic.subject html?>43 <?cs var:topic.subject ?> 44 44 </a> 45 45 </td> trunk/tracforums/templates/tracforums/profile/edit.cs
r52 r71 62 62 <div class="field"> 63 63 <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> 65 69 </div> 66 70 <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> 70 77 <div class="field"> 71 78 <label for="sig" style="float:left">Signature:</label> trunk/tracforums/templates/tracforums/profile/view.cs
r45 r71 1 1 <?cs include "tracforums/header.cs" ?> 2 2 <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?>7 3 8 4 <?cs if:forums.profile.canModify ?> … … 12 8 <input type='submit' value='Modify This Profile'> 13 9 </form> 14 <?cs /if?> 10 <?cs /if?> 15 11 12 <?cs with:profile = forums.profile?> 13 <?cs include "tracforums/profile/viewProfile.cs" ?> 14 <?cs /with?> 15 16 16 <h2>Forum Avatars</h2> 17 17 <br> trunk/tracforums/templates/tracforums/profile/viewProfile.cs
r52 r71 10 10 <?cs /if?> 11 11 12 <h2 style="clear:both">Forum Statistics</h2> 12 13 13 <?cs if:profile.bio == '' && profile.defaultavatarid ?> 14 14 <img src="<?cs var:trac.href.forums ?>/avatar/<?cs var:forums.defaultavatar.id?>" … … 17 17 style="float:left;margin:15px"> 18 18 <?cs /if?> 19 <div style="clear:both"> </div> 19 20 <table> 20 21 <tr> … … 31 32 </tr> 32 33 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 ?> 34 47 <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 39 56 <?cs if:profile.sightml?> 40 57 <tr> … … 44 61 <?cs /if?> 45 62 </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 200 200 req.args['authname'] = req.authname # grab authname here 201 201 202 context = UIContext(req,self.env)203 202 db = get_forumDB(self.env) 203 context = UIContext(req,self.env,db) 204 204 viewName = req.args['view'] 205 205
