source: peerreviewplugin/trunk/codereview/peerReviewSearch.py

Last change on this file was 18261, checked in by Cinc-th, 2 years ago

PeerReviewPlugin: no longer use CamelCase URLs. Fixed a testcase using unicode strings for Python3.

Refs #14005

File size: 5.7 KB
Line 
1#
2# Copyright (C) 2005-2006 Team5
3# Copyright (C) 2016-2021 Cinc
4#
5# All rights reserved.
6#
7# This software is licensed as described in the file COPYING.txt, which
8# you should have received as part of this distribution.
9#
10# Author: Team5
11#
12
13import datetime
14import itertools
15
16from codereview.model import PeerReviewModel
17from trac.core import *
18from trac.util.datefmt import format_date, to_datetime, to_utimestamp, user_time, utc
19from trac.web.chrome import add_stylesheet, add_script, add_script_data, Chrome, INavigationContributor
20from trac.web.main import IRequestHandler
21
22from .peerReviewMain import add_ctxt_nav_items
23from .model import get_users
24
25
26class PeerReviewSearch(Component):
27    implements(IRequestHandler, INavigationContributor)
28
29    # IRequestHandler methods
30
31    def match_request(self, req):
32        if req.path_info == '/peerreviewsearch':
33            return True
34        elif req.path_info == '/peerReviewSearch':
35            self.env.log.info("Legacy URL 'peerReviewSearch' called from: %s", req.get_header('Referer'))
36            return True
37        return False
38
39    # INavigationContributor methods
40
41    def get_active_navigation_item(self, req):
42        return 'peerreviewmain'
43
44    def get_navigation_items(self, req):
45        return []
46
47    def process_request(self, req):
48        req.perm.require('CODE_REVIEW_DEV')
49        data = {}
50
51        # if the doSearch parameter is 'yes', perform the search
52        # this parameter is set when someone searches
53        if req.args.get('doSearch') == 'yes' or True:  # always start with the full list for now
54            results = self.performSearch(req, data)
55            if len(results) == 0:
56                noValResult = ["No results match query.", "", "", "", "", ""]
57                results.append(noValResult)
58            data['results'] = results
59            data['doSearch'] = 'yes'
60
61        users = get_users(self.env)
62        # sets the possible users for the user combo-box
63        data['users'] = users
64        # creates a year array containing the last 10
65        # years - for the year combo-box
66        now = datetime.datetime.now()
67        year = now.year
68        years = []
69        for i in range(0, 11):
70            years.append(year - i)
71
72        data['years'] = years
73        data['cycle'] = itertools.cycle
74
75        add_stylesheet(req, 'common/css/code.css')
76        add_stylesheet(req, 'common/css/browser.css')
77        add_stylesheet(req, 'hw/css/peerreview.css')
78        add_script(req, 'hw/js/peerReviewSearch.js')
79        if req.args.get('doSearch'):
80            add_script_data(req, {'dateIndexSelected': '01',
81                                  'monthSelected': data['searchValues_month'],
82                                  'daySelected': data['searchValues_day'],
83                                  'yearSelected': data['searchValues_year'],
84                                  'statusSelected': data['searchValues_status'],
85                                  'authorSelected': data['searchValues_author'],
86                                  'nameSelected': data['searchValues_name']})
87        else:
88            add_script_data(req, {'dateIndexSelected': '',
89                                  'monthSelected': '',
90                                  'daySelected': '',
91                                  'yearSelected': '',
92                                  'statusSelected': '',
93                                  'authorSelected': '',
94                                  'nameSelected': ''})
95        add_ctxt_nav_items(req)
96        if hasattr(Chrome, 'jenv'):
97            return 'peerreview_search_jinja.html', data
98        else:
99            return 'peerreview_search.html', data, None
100
101    # Performs the search
102
103    def performSearch(self, req, data):
104        # get the search parameters from POST
105        author = req.args.get('Author', '')
106        name = req.args.get('CodeReviewName', '')
107        status = req.args.get('Status', '')
108        month = req.args.get('DateMonth', '0')
109        day = req.args.get('DateDay', '0')
110        year = req.args.get('DateYear', '0')
111
112        # store date values for JavaScript
113        data['searchValues_month'] = month
114        data['searchValues_day'] = day
115        data['searchValues_year'] = year
116        data['searchValues_status'] = status
117        data['searchValues_author'] = author
118        data['searchValues_name'] = name
119
120        # dates are utimes for reviews
121        fromdate = None
122        date = None
123        if (month != '0') and (day != '0') and (year != '0'):
124            # implicitely converts to suitable timezone
125            date = to_datetime(datetime.datetime(int(year), int(month), int(day)))
126            fromdate = to_utimestamp(date)
127
128        selectString = 'Select...'
129
130        returnArray = []
131
132        rev_model = PeerReviewModel(self.env)
133        rev_model.clear_props()
134        if status and status != selectString:
135            rev_model['status'] = status
136        if name:
137            rev_model['name'] = "%" + name + "%"
138        if author and author != selectString:
139            rev_model['owner'] = author
140
141        for rev in rev_model.list_matching_objects(exact_match=False):
142            tempArray = [rev['review_id'], rev['owner'], rev['status'],
143                         user_time(req, format_date, to_datetime(rev['created'])), rev['name']]
144            if rev['closed']:
145                tempArray.append(user_time(req, format_date, to_datetime(rev['closed'])))
146            else:
147                tempArray.append('')
148            if date:
149                if rev['created'] > fromdate:
150                    returnArray.append(tempArray)
151            else:
152                returnArray.append(tempArray)
153
154        return returnArray
Note: See TracBrowser for help on using the repository browser.