Changeset 3542

Show
Ignore:
Timestamp:
04/23/08 07:57:49 (6 months ago)
Author:
proofek
Message:

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

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • peerreviewplugin/branches/2.1-toddler/codereview/peerReviewBrowser.py

    r3451 r3542  
    2323from trac.wiki import wiki_to_html, wiki_to_oneliner, IWikiSyntaxProvider 
    2424from trac.versioncontrol.web_ui.util import * 
     25from trac.util import sorted, embedded_numbers 
    2526 
    2627from genshi.builder import tag 
     
    8283 
    8384    def process_request(self, req): 
     85 
     86        data = {} 
    8487        path = req.args.get('path', '/') 
    8588        rev = req.args.get('rev') 
     
    9699                             in self.config.get('browser', 'hide_properties', 
    97100                                                '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, 
    101109            'revision': rev or repos.youngest_rev, 
    102110            'props': dict([(util.escape(name), util.escape(value)) 
    103111                           for name, value in node.get_properties().items() 
    104112                           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)  
    108117        } 
    109118 
    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_links 
    116  
    117         if node.isdir: 
    118             req.hdf['browser.is_dir'] = True 
    119             self._render_directory(req, repos, node, rev) 
    120         else: 
    121             self._render_file(req, context, repos, node, rev) 
    122  
    123119        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 
    125123 
    126124    # Internal methods 
    127125 
    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 
    133128        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 + '/' 
    136134            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                }) 
    140138        return links 
    141139 
     
    144142 
    145143        order = req.args.get('order', 'name').lower() 
    146         req.hdf['browser.order'] = order 
    147144        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 
    149159 
    150160        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 
    151178        for entry in node.get_entries(): 
    152179            entry_rev = rev and entry.rev 
     
    180207        info.sort(cmp_func) 
    181208 
    182         req.hdf['browser.items'] = info 
    183         req.hdf['browser.changes'] = changes 
     209        return {'order': order, 'desc': desc and 1 or None, 
     210                'items': info, 'changes': changes } 
    184211 
    185212    def _render_file(self, req, context, repos, node, rev=None): 
     
    187214 
    188215        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 
    198217        mime_type = node.content_type 
    199218        if not mime_type or mime_type == 'application/octet-stream': 
     
    239258                         'text/plain') 
    240259 
    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') 
    249261 
    250262            raw_href = self.env.href.peerReviewBrowser(node.path, rev=rev and node.rev, 
     
    256268                                                    annotations=['lineno']) 
    257269 
    258             req.hdf['file'] = preview_data 
    259  
    260270            add_link(req, 'alternate', raw_href, 'Original Format', mime_type) 
    261  
    262             add_stylesheet(req, 'common/css/code.css') 
    263271 
    264272            return { 
    265273                'changeset': changeset, 
    266274                'size': node.content_length, 
    267                 'preview': preview_data
     275                'preview': preview_data['rendered']
    268276                '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) 
    269284                } 
    270285    # IWikiSyntaxProvider methods 
  • peerreviewplugin/branches/2.1-toddler/codereview/peerReviewNew.py

    r3505 r3542  
    2222from trac.web.chrome import add_stylesheet 
    2323import time 
     24import itertools 
    2425 
    2526class UserbaseModule(Component): 
     
    4142 
    4243    def process_request(self, req): 
     44         
     45        data = {} 
     46 
    4347        if req.perm.has_permission('CODE_REVIEW_MGR'): 
    44             req.hdf['manager'] = 1 
     48            data['manager'] = 1 
    4549        else: 
    4650            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 
    6058        db = self.env.get_db_cnx() 
    6159        dbBack = dbBackend(db) 
    6260        allUsers = dbBack.getPossibleUsers() 
     61 
    6362        reviewID = req.args.get('resubmit') 
    64         req.hdf['oldid'] = -1 
     63        data['oldid'] = -1 
    6564 
    6665        # if we tried resubmitting and the reviewID is not a valid number or not a valid code review, error 
    6766        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', None 
    72              
     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 
    7372        # if we are resubmitting a code review and we are the author or the manager 
    7473        if reviewID != None and (dbBack.getCodeReviewsByID(reviewID).Author == util.get_reporter_id(req) or req.perm.has_permission('CODE_REVIEW_MGR')): 
    7574            review = dbBack.getCodeReviewsByID(reviewID) 
    76             req.hdf['new'] = "no" 
    77             req.hdf['oldid'] = reviewID 
     75            data['new'] = "no" 
     76            data['oldid'] = reviewID 
    7877            # get code review data and populate 
    7978            userStructs = dbBack.getReviewers(reviewID) 
     
    8382                returnUsers+=struct.Reviewer + "#" 
    8483                popUsers.append(struct.Reviewer) 
     84 
    8585            files = dbBack.getReviewFiles(reviewID) 
    8686            returnFiles = "" 
     
    9595                tempFiles.append(struct.LineEnd) 
    9696                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 
    103104 
    104105            # Figure out the users that were not included 
     
    116117                    if match == "no": 
    117118                        notUsers.append(user) 
    118                 req.hdf['notPrevUsers'] = notUsers 
    119                 req.hdf['emptyList'] = 0 
     119                data['notPrevUsers'] = notUsers 
     120                data['emptyList'] = 0 
    120121            else: 
    121                 req.hdf['notPrevUsers'] = [] 
    122                 req.hdf['emptyList'] = 1 
     122                data['notPrevUsers'] = [] 
     123                data['emptyList'] = 1 
    123124        #if we resubmitting a code review, and are neiter the author and the manager 
    124125        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', None 
     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 
    129130        #if we are not resubmitting 
    130131        else: 
    131             if req.args.get('reqAction') == 'createCodeReview':               
     132            if req.args.get('reqAction') == 'createCodeReview': 
    132133                oldid = req.args.get('oldid') 
    133134                if oldid != None: 
     
    139140                req.redirect(self.env.href.peerReviewView() + '?Review=' + str(returnid)) 
    140141            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 
    149155 
    150156    # ITemplateProvider methods 
  • peerreviewplugin/branches/2.1-toddler/setup.py

    r3488 r3542  
    66setup( 
    77    name = 'TracCodeReview', 
    8     version = '2.0dev', 
     8    version = '2.1-toddler', 
    99    packages = ['codereview'], 
    1010    package_data={ 'codereview' : [ 'templates/*.cs', 'templates/*.html', 'htdocs/images/*.*', 'htdocs/js/*.js' ] }, 
    1111    author = "Team5", 
    1212    author_email = "UNKNOWN", 
    13     maintainer = "Noah Kantrowitz", 
    14     maintainer_email = "noah@coderanger.net", 
     13    maintainer = "Sebastian Marek", 
     14    maintainer_email = "smarek@plus.net", 
    1515    description = "Framework for realtime code review within Trac.", 
    1616    license = "BSD", 
     
    2525 
    2626) 
    27  
    28