Changeset 3542
- Timestamp:
- 04/23/08 07:57:49 (6 months ago)
- Files:
-
- peerreviewplugin/branches/2.1-toddler/codereview/peerReviewBrowser.py (modified) (8 diffs)
- peerreviewplugin/branches/2.1-toddler/codereview/peerReviewNew.py (modified) (6 diffs)
- peerreviewplugin/branches/2.1-toddler/codereview/templates/peerReviewBrowser.cs (deleted)
- peerreviewplugin/branches/2.1-toddler/codereview/templates/peerReviewBrowser.html (added)
- peerreviewplugin/branches/2.1-toddler/codereview/templates/peerReviewCommentCallback.cs (deleted)
- peerreviewplugin/branches/2.1-toddler/codereview/templates/peerReviewNew.cs (deleted)
- peerreviewplugin/branches/2.1-toddler/codereview/templates/peerReviewNew.html (added)
- peerreviewplugin/branches/2.1-toddler/setup.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
peerreviewplugin/branches/2.1-toddler/codereview/peerReviewBrowser.py
r3451 r3542 23 23 from trac.wiki import wiki_to_html, wiki_to_oneliner, IWikiSyntaxProvider 24 24 from trac.versioncontrol.web_ui.util import * 25 from trac.util import sorted, embedded_numbers 25 26 26 27 from genshi.builder import tag … … 82 83 83 84 def process_request(self, req): 85 86 data = {} 84 87 path = req.args.get('path', '/') 85 88 rev = req.args.get('rev') … … 96 99 in self.config.get('browser', 'hide_properties', 97 100 'svk:merge').split(',')] 98 req.hdf['title'] = path 99 req.hdf['browser'] = { 100 'path': path, 101 context = Context.from_request(req, 'source', path, node.created_rev) 102 103 path_links = self.get_path_links_CRB(self.env.href, path, rev) 104 if len(path_links) > 1: 105 add_link(req, 'up', path_links[-2]['href'], 'Parent directory') 106 107 data = { 108 'path': path, 'rev': node.rev, 'stickyrev': rev, 101 109 'revision': rev or repos.youngest_rev, 102 110 'props': dict([(util.escape(name), util.escape(value)) 103 111 for name, value in node.get_properties().items() 104 112 if not name in hidden_properties]), 105 'href': util.escape(self.env.href.peerReviewBrowser(path, rev=rev or 106 repos.youngest_rev)), 107 'log_href': util.escape(self.env.href.log(path, rev=rev or None)) 113 'log_href': util.escape(self.env.href.log(path, rev=rev or None)), 114 'path_links': path_links, 115 'dir': node.isdir and self._render_directory(req, repos, node, rev), 116 'file': node.isfile and self._render_file(req, context, repos, node, rev) 108 117 } 109 118 110 context = Context.from_request(req, 'source', path, node.created_rev)111 112 path_links = self.get_path_links_CRB(self.env.href, path, rev)113 if len(path_links) > 1:114 add_link(req, 'up', path_links[-2]['href'], 'Parent directory')115 req.hdf['browser.path'] = path_links116 117 if node.isdir:118 req.hdf['browser.is_dir'] = True119 self._render_directory(req, repos, node, rev)120 else:121 self._render_file(req, context, repos, node, rev)122 123 119 add_stylesheet(req, 'common/css/browser.css') 124 return 'peerReviewBrowser.cs', None 120 add_stylesheet(req, 'common/css/code.css') 121 122 return 'peerReviewBrowser.html', data, None 125 123 126 124 # Internal methods 127 125 128 def get_path_links_CRB(self, href, path, rev): 129 links = [] 130 parts = path.split('/') 131 if not parts[-1]: 132 parts.pop() 126 def get_path_links_CRB(self, href, fullpath, rev): 127 133 128 path = '/' 134 for part in parts: 135 path = path + part + '/' 129 links = [{'name': 'root', 130 'href': href.peerReviewBrowser(path, rev=rev)}] 131 132 for part in [p for p in fullpath.split('/') if p]: 133 path += part + '/' 136 134 links.append({ 137 'name': part or 'root',138 'href': util.escape(href.peerReviewBrowser(path, rev=rev))139 })135 'name': part, 136 'href': href.peerReviewBrowser(path, rev=rev) 137 }) 140 138 return links 141 139 … … 144 142 145 143 order = req.args.get('order', 'name').lower() 146 req.hdf['browser.order'] = order147 144 desc = req.args.has_key('desc') 148 req.hdf['browser.desc'] = desc and 1 or 0 145 146 # Entries metadata 147 class entry(object): 148 __slots__ = 'name rev kind isdir path content_length'.split() 149 def __init__(self, node): 150 for f in entry.__slots__: 151 setattr(self, f, getattr(n, f)) 152 def display(self): 153 result = '' 154 for f in entry.__slots__: 155 result = "%s slot: %s, value: %s;" % (result, f, getattr(n, f)) 156 157 return result 158 149 159 150 160 info = [] 161 162 if order == 'date': 163 def file_order(a): 164 return changes[a.rev].date 165 elif order == 'size': 166 def file_order(a): 167 return (a.content_length, 168 embedded_numbers(a.name.lower())) 169 else: 170 def file_order(a): 171 return embedded_numbers(a.name.lower()) 172 173 dir_order = desc and 1 or -1 174 175 def browse_order(a): 176 return a.isdir and dir_order or 0, file_order(a) 177 151 178 for entry in node.get_entries(): 152 179 entry_rev = rev and entry.rev … … 180 207 info.sort(cmp_func) 181 208 182 re q.hdf['browser.items'] = info183 req.hdf['browser.changes'] = changes209 return {'order': order, 'desc': desc and 1 or None, 210 'items': info, 'changes': changes } 184 211 185 212 def _render_file(self, req, context, repos, node, rev=None): … … 187 214 188 215 changeset = repos.get_changeset(node.rev) 189 req.hdf['file'] = { 190 'rev': node.rev, 191 'changeset_href': util.escape(self.env.href.changeset(node.rev)), 192 'date': util.format_datetime(changeset.date), 193 'age': util.pretty_timedelta(changeset.date), 194 'author': changeset.author or 'anonymous', 195 'message': wiki_to_html(changeset.message or '--', self.env, req, 196 escape_newlines=True) 197 } 216 198 217 mime_type = node.content_type 199 218 if not mime_type or mime_type == 'application/octet-stream': … … 239 258 'text/plain') 240 259 241 # content = node.get_content().read(mimeview.max_preview_size) 242 #if not is_binary(content): 243 # if mime_type != 'text/plain': 244 # plain_href = self.env.href.peerReviewBrowser(node.path, 245 # rev=rev and node.rev, 246 # format='txt') 247 # add_link(req, 'alternate', plain_href, 'Plain Text', 248 # 'text/plain') 260 add_stylesheet(req, 'common/css/code.css') 249 261 250 262 raw_href = self.env.href.peerReviewBrowser(node.path, rev=rev and node.rev, … … 256 268 annotations=['lineno']) 257 269 258 req.hdf['file'] = preview_data259 260 270 add_link(req, 'alternate', raw_href, 'Original Format', mime_type) 261 262 add_stylesheet(req, 'common/css/code.css')263 271 264 272 return { 265 273 'changeset': changeset, 266 274 'size': node.content_length, 267 'preview': preview_data ,275 'preview': preview_data['rendered'], 268 276 'annotate': False, 277 'rev': node.rev, 278 'changeset_href': util.escape(self.env.href.changeset(node.rev)), 279 'date': util.format_datetime(changeset.date), 280 'age': util.pretty_timedelta(changeset.date), 281 'author': changeset.author or 'anonymous', 282 'message': wiki_to_html(changeset.message or '--', self.env, req, 283 escape_newlines=True) 269 284 } 270 285 # IWikiSyntaxProvider methods peerreviewplugin/branches/2.1-toddler/codereview/peerReviewNew.py
r3505 r3542 22 22 from trac.web.chrome import add_stylesheet 23 23 import time 24 import itertools 24 25 25 26 class UserbaseModule(Component): … … 41 42 42 43 def process_request(self, req): 44 45 data = {} 46 43 47 if req.perm.has_permission('CODE_REVIEW_MGR'): 44 req.hdf['manager'] = 148 data['manager'] = 1 45 49 else: 46 50 req.perm.assert_permission('CODE_REVIEW_DEV') 47 req.hdf['manager'] = 0 48 49 # set up the dynamic links 50 req.hdf['trac.href.peerReviewMain'] = self.env.href.peerReviewMain() 51 req.hdf['trac.href.peerReviewNew'] = self.env.href.peerReviewNew() 52 req.hdf['trac.href.peerReviewSearch'] = self.env.href.peerReviewSearch() 53 req.hdf['trac.href.peerReviewOptions'] = self.env.href.peerReviewOptions() 54 55 req.hdf['main'] = "no" 56 req.hdf['create'] = "yes" 57 req.hdf['search'] = "no" 58 req.hdf['options'] = "no" 59 51 data['manager'] = 0 52 53 data['main'] = "no" 54 data['create'] = "yes" 55 data['search'] = "no" 56 data['option'] = "no" 57 60 58 db = self.env.get_db_cnx() 61 59 dbBack = dbBackend(db) 62 60 allUsers = dbBack.getPossibleUsers() 61 63 62 reviewID = req.args.get('resubmit') 64 req.hdf['oldid'] = -163 data['oldid'] = -1 65 64 66 65 # if we tried resubmitting and the reviewID is not a valid number or not a valid code review, error 67 66 if reviewID != None and (not reviewID.isdigit() or dbBack.getCodeReviewsByID(reviewID) == None): 68 req.hdf['error.type'] = "TracError"69 req.hdf['error.title'] = "Resubmit ID error"70 req.hdf['error.message'] = "Invalid resubmit ID supplied - unable to load page correctly."71 return 'error. cs', None72 67 data['error.type'] = "TracError" 68 data['error.title'] = "Resubmit ID error" 69 data['error.message'] = "Invalid resubmit ID supplied - unable to load page correctly." 70 return 'error.html', data, None 71 73 72 # if we are resubmitting a code review and we are the author or the manager 74 73 if reviewID != None and (dbBack.getCodeReviewsByID(reviewID).Author == util.get_reporter_id(req) or req.perm.has_permission('CODE_REVIEW_MGR')): 75 74 review = dbBack.getCodeReviewsByID(reviewID) 76 req.hdf['new'] = "no"77 req.hdf['oldid'] = reviewID75 data['new'] = "no" 76 data['oldid'] = reviewID 78 77 # get code review data and populate 79 78 userStructs = dbBack.getReviewers(reviewID) … … 83 82 returnUsers+=struct.Reviewer + "#" 84 83 popUsers.append(struct.Reviewer) 84 85 85 files = dbBack.getReviewFiles(reviewID) 86 86 returnFiles = "" … … 95 95 tempFiles.append(struct.LineEnd) 96 96 popFiles.append(tempFiles); 97 req.hdf['files'] = returnFiles 98 req.hdf['name'] = review.Name 99 req.hdf['notes'] = review.Notes 100 req.hdf['reviewers'] = returnUsers 101 req.hdf['prevUsers'] = popUsers 102 req.hdf['prevFiles'] = popFiles 97 98 data['files'] = returnFiles 99 data['name'] = review.Name 100 data['notes'] = review.Notes 101 data['reviewers'] = returnUsers 102 data['prevUsers'] = popUsers 103 data['prevFiles'] = popFiles 103 104 104 105 # Figure out the users that were not included … … 116 117 if match == "no": 117 118 notUsers.append(user) 118 req.hdf['notPrevUsers'] = notUsers119 req.hdf['emptyList'] = 0119 data['notPrevUsers'] = notUsers 120 data['emptyList'] = 0 120 121 else: 121 req.hdf['notPrevUsers'] = []122 req.hdf['emptyList'] = 1122 data['notPrevUsers'] = [] 123 data['emptyList'] = 1 123 124 #if we resubmitting a code review, and are neiter the author and the manager 124 125 elif reviewID != None and not dbBack.getCodeReviewsByID(reviewID).Author == util.get_reporter_id(req) and not req.perm.has_permission('CODE_REVIEW_MGR'): 125 req.hdf['error.type'] = "TracError"126 req.hdf['error.title'] = "Access error"127 req.hdf['error.message'] = "You need to be a manager or the author of this code review to resubmit it."128 return 'error. cs', None126 data['error.type'] = "TracError" 127 data['error.title'] = "Access error" 128 data['error.message'] = "You need to be a manager or the author of this code review to resubmit it." 129 return 'error.html', data, None 129 130 #if we are not resubmitting 130 131 else: 131 if req.args.get('reqAction') == 'createCodeReview': 132 if req.args.get('reqAction') == 'createCodeReview': 132 133 oldid = req.args.get('oldid') 133 134 if oldid != None: … … 139 140 req.redirect(self.env.href.peerReviewView() + '?Review=' + str(returnid)) 140 141 else: 141 req.hdf['new'] = "yes" 142 143 req.hdf['users'] = allUsers 144 req.hdf['trac.href.peerReviewBrowser'] = self.env.href.peerReviewBrowser() 145 add_stylesheet(req, 'common/css/code.css') 146 add_stylesheet(req, 'common/css/browser.css') 147 return 'peerReviewNew.cs', None 148 142 data['new'] = "yes" 143 144 if data['new'] == "yes": 145 data['reviewersSelectedValue'] = {'value': ''} 146 data['filesSelectedValue'] = {'value': ''} 147 else: 148 data['reviewersSelectedValue'] = {'value': returnUsers} 149 data['filesSelectedValue'] = {'value': returnFiles} 150 151 data['users'] = allUsers 152 data['cycle'] = itertools.cycle 153 154 return 'peerReviewNew.html', data, None 149 155 150 156 # ITemplateProvider methods peerreviewplugin/branches/2.1-toddler/setup.py
r3488 r3542 6 6 setup( 7 7 name = 'TracCodeReview', 8 version = '2. 0dev',8 version = '2.1-toddler', 9 9 packages = ['codereview'], 10 10 package_data={ 'codereview' : [ 'templates/*.cs', 'templates/*.html', 'htdocs/images/*.*', 'htdocs/js/*.js' ] }, 11 11 author = "Team5", 12 12 author_email = "UNKNOWN", 13 maintainer = " Noah Kantrowitz",14 maintainer_email = " noah@coderanger.net",13 maintainer = "Sebastian Marek", 14 maintainer_email = "smarek@plus.net", 15 15 description = "Framework for realtime code review within Trac.", 16 16 license = "BSD", … … 25 25 26 26 ) 27 28
