root/peerreviewplugin/branches/2.2-dev/codereview/peerReviewNew.py

Revision 3542, 8.2 kB (checked in by proofek, 9 months ago)

Peer Review Browser and adding new peer review page are fully using genshi now

Line 
1 #       
2 # Copyright (C) 2005-2006 Team5
3 # All rights reserved. 
4 #       
5 # This software is licensed as described in the file COPYING.txt, which
6 # you should have received as part of this distribution.       
7 #       
8 # Author: Team5
9 #
10
11 # Provides functionality to create a new code review.
12 # Works with peerReviewNew.cs
13
14 from trac.core import *
15 from trac.web.chrome import INavigationContributor,ITemplateProvider
16 from trac.web.main import IRequestHandler
17 from trac import util
18 from trac.util import escape
19 from codereview.CodeReviewStruct import *
20 from codereview.dbBackend import *
21 from codereview.ReviewerStruct import *
22 from trac.web.chrome import add_stylesheet
23 import time
24 import itertools
25
26 class UserbaseModule(Component):
27     implements(IRequestHandler, ITemplateProvider, INavigationContributor)
28    
29
30     # INavigationContributor methods
31     def get_active_navigation_item(self, req):
32         return 'peerReviewMain'
33
34     def get_navigation_items(self, req):
35         return []
36        
37
38     # IRequestHandler methods
39     def match_request(self, req):
40         return req.path_info == '/peerReviewNew'
41                                        
42
43     def process_request(self, req):
44        
45         data = {}
46
47         if req.perm.has_permission('CODE_REVIEW_MGR'):
48             data['manager'] = 1
49         else:
50             req.perm.assert_permission('CODE_REVIEW_DEV')
51             data['manager'] = 0
52
53         data['main'] = "no"
54         data['create'] = "yes"
55         data['search'] = "no"
56         data['option'] = "no"
57
58         db = self.env.get_db_cnx()
59         dbBack = dbBackend(db)
60         allUsers = dbBack.getPossibleUsers()
61
62         reviewID = req.args.get('resubmit')
63         data['oldid'] = -1
64
65         # if we tried resubmitting and the reviewID is not a valid number or not a valid code review, error
66         if reviewID != None and (not reviewID.isdigit() or dbBack.getCodeReviewsByID(reviewID) == None):
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
72         # if we are resubmitting a code review and we are the author or the manager
73         if reviewID != None and (dbBack.getCodeReviewsByID(reviewID).Author == util.get_reporter_id(req) or req.perm.has_permission('CODE_REVIEW_MGR')):
74             review = dbBack.getCodeReviewsByID(reviewID)
75             data['new'] = "no"
76             data['oldid'] = reviewID
77             # get code review data and populate
78             userStructs = dbBack.getReviewers(reviewID)
79             returnUsers = ""
80             popUsers = []
81             for struct in userStructs:
82                 returnUsers+=struct.Reviewer + "#"
83                 popUsers.append(struct.Reviewer)
84
85             files = dbBack.getReviewFiles(reviewID)
86             returnFiles = ""
87             popFiles = []
88             # Set up the file information
89             for struct in files:
90                 returnFiles+= "%s,%s,%s, %s#" % (struct.Path, struct.Version, struct.LineStart, struct.LineEnd )
91                 tempFiles = []
92                 tempFiles.append(struct.Path)
93                 tempFiles.append(struct.Version)
94                 tempFiles.append(struct.LineStart)
95                 tempFiles.append(struct.LineEnd)
96                 popFiles.append(tempFiles);
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
104
105             # Figure out the users that were not included
106             # in the previous code review so that they can be
107             # added to the dropdown to select more users
108             # (only check if all users were not included in previous code review)
109             notUsers = []
110             if len(popUsers) != len(allUsers):
111                 for user in allUsers:
112                     match = "no"
113                     for candidate in popUsers:
114                         if candidate == user:
115                             match = "yes"
116                             break
117                     if match == "no":
118                         notUsers.append(user)
119                 data['notPrevUsers'] = notUsers
120                 data['emptyList'] = 0
121             else:
122                 data['notPrevUsers'] = []
123                 data['emptyList'] = 1
124         #if we resubmitting a code review, and are neiter the author and the manager
125         elif reviewID != None and not dbBack.getCodeReviewsByID(reviewID).Author == util.get_reporter_id(req) and not req.perm.has_permission('CODE_REVIEW_MGR'):
126             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
130         #if we are not resubmitting
131         else:
132             if req.args.get('reqAction') == 'createCodeReview':
133                 oldid = req.args.get('oldid')
134                 if oldid != None:
135                     review = dbBack.getCodeReviewsByID(oldid)
136                     review.Status = "Closed"
137                     review.save(db)
138                 returnid = self.createCodeReview(req)
139                 #If no errors then redirect to the viewCodeReview page
140                 req.redirect(self.env.href.peerReviewView() + '?Review=' + str(returnid))
141             else:
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
155
156     # ITemplateProvider methods
157     def get_templates_dirs(self):
158         """
159         Return the absolute path of the directory containing the provided
160         ClearSilver templates.
161         """
162         from pkg_resources import resource_filename
163         return [resource_filename(__name__, 'templates')]
164
165
166     # Needed to be filled out based on interface
167     def get_htdocs_dirs(self):
168         from pkg_resources import resource_filename
169         return [('hw', resource_filename(__name__, 'htdocs'))]
170
171
172     # Takes the information given when the page is posted
173     # and creates a new code review struct in the database
174     # and populates it with the information.  Also creates
175     # new reviewer structs and file structs for the review.
176     def createCodeReview(self, req):
177         struct = CodeReviewStruct(None)
178         struct.Author = util.get_reporter_id(req)
179         struct.Status = 'Open for review'
180         struct.DateCreate = int(time.time())
181         struct.Name = req.args.get('Name')
182         struct.Notes = req.args.get('Notes')
183         id = struct.save(self.env.get_db_cnx())
184         self.log.debug('BEN %s', id)       
185         # loop here through all the reviewers
186         # and create new reviewer structs based on them
187         string = req.args.get('ReviewersSelected')
188         tokens = string.split('#')
189         for token in tokens:
190             if token != "":
191                 struct = ReviewerStruct(None)
192                 struct.IDReview = id
193                 struct.Reviewer = token
194                 struct.Status = 0
195                 struct.Vote = "-1"
196                 struct.save(self.env.get_db_cnx())
197
198         # loop here through all included files
199         # and create new file structs based on them
200         files = req.args.get('FilesSelected')
201         items = files.split('#')
202         for item in items:
203             if item != "":
204                 segment = item.split(',')
205                 struct = ReviewFileStruct(None)
206                 struct.IDReview = id
207                 struct.Path = segment[0]
208                 struct.Version = segment[1]
209                 struct.LineStart = segment[2]
210                 struct.LineEnd = segment[3]
211                 struct.save(self.env.get_db_cnx())
212
213         return id   
Note: See TracBrowser for help on using the browser.