annotate bitten/trac_ext/web_ui.py @ 141:0e21778c04ef

Refactoring: split up the components and templates that render the web interface.
author cmlenz
date Thu, 18 Aug 2005 10:14:21 +0000
parents 4289fa18de0f
children 5a27ec93100d
rev   line source
35
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
1 # -*- coding: iso8859-1 -*-
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
2 #
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
3 # Copyright (C) 2005 Christopher Lenz <cmlenz@gmx.de>
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
4 #
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
5 # Bitten is free software; you can redistribute it and/or
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
6 # modify it under the terms of the GNU General Public License as
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
7 # published by the Free Software Foundation; either version 2 of the
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
8 # License, or (at your option) any later version.
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
9 #
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
10 # Trac is distributed in the hope that it will be useful,
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
13 # General Public License for more details.
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
14 #
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
15 # You should have received a copy of the GNU General Public License
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
16 # along with this program; if not, write to the Free Software
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
17 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
18 #
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
19 # Author: Christopher Lenz <cmlenz@gmx.de>
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
20
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
21 import re
50
0d5ad32948b7 Restrict access to web interface with custom permission actions.
cmlenz
parents: 47
diff changeset
22 from time import localtime, strftime
35
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
23
99
efc1eed69ba8 Make Bitten deployable in Trac as a [http://peak.telecommunity.com/DevCenter/PythonEggs Python egg].
cmlenz
parents: 98
diff changeset
24 import pkg_resources
35
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
25 from trac.core import *
64
de1a7499f4d6 Basic timeline provider for builds.
cmlenz
parents: 60
diff changeset
26 from trac.Timeline import ITimelineEventProvider
47
083e848088ee * Improvements to the model classes, and a couple of unit tests.
cmlenz
parents: 45
diff changeset
27 from trac.util import escape, pretty_timedelta
74
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
28 from trac.web.chrome import INavigationContributor, ITemplateProvider, \
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
29 add_link, add_stylesheet
139
4289fa18de0f * Clean up some imports.
cmlenz
parents: 138
diff changeset
30 from trac.web import IRequestHandler
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
31 from trac.wiki import wiki_to_html
112
a38eabd4b6e1 * Store build logs in a structured way, for example to highlight messages on the error stream.
cmlenz
parents: 111
diff changeset
32 from bitten.model import BuildConfig, TargetPlatform, Build, BuildStep, BuildLog
120
b63ed684c29c Show the list of reports generated on the build page.
cmlenz
parents: 114
diff changeset
33 from bitten.store import ReportStore
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
34 from bitten.trac_ext.api import ILogFormatter
114
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
35
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
36 _status_label = {Build.IN_PROGRESS: 'in progress',
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
37 Build.SUCCESS: 'completed',
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
38 Build.FAILURE: 'failed'}
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
39
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
40 def _build_to_hdf(env, req, build):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
41 hdf = {'id': build.id, 'name': build.slave, 'rev': build.rev,
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
42 'status': _status_label[build.status],
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
43 'cls': _status_label[build.status].replace(' ', '-'),
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
44 'href': env.href.build(build.config, build.id),
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
45 'chgset_href': env.href.changeset(build.rev)}
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
46 if build.started:
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
47 hdf['started'] = strftime('%x %X', localtime(build.started))
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
48 hdf['started_delta'] = pretty_timedelta(build.started)
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
49 if build.stopped:
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
50 hdf['stopped'] = strftime('%x %X', localtime(build.stopped))
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
51 hdf['stopped_delta'] = pretty_timedelta(build.stopped)
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
52 hdf['duration'] = pretty_timedelta(build.stopped, build.started)
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
53 hdf['slave'] = {
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
54 'name': build.slave,
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
55 'ip_address': build.slave_info.get(Build.IP_ADDRESS),
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
56 'os': build.slave_info.get(Build.OS_NAME),
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
57 'os.family': build.slave_info.get(Build.OS_FAMILY),
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
58 'os.version': build.slave_info.get(Build.OS_VERSION),
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
59 'machine': build.slave_info.get(Build.MACHINE),
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
60 'processor': build.slave_info.get(Build.PROCESSOR)
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
61 }
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
62 return hdf
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
63
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
64 class BittenChrome(Component):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
65 """Provides the Bitten templates and static resources."""
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
66
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
67 implements(ITemplateProvider)
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
68
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
69 # ITemplatesProvider methods
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
70
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
71 def get_htdocs_dir(self):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
72 return pkg_resources.resource_filename(__name__, 'htdocs')
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
73
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
74 def get_templates_dir(self):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
75 return pkg_resources.resource_filename(__name__, 'templates')
114
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
76
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
77
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
78 class BuildConfigController(Component):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
79 """Implements the web interface for build configurations."""
35
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
80
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
81 implements(INavigationContributor, IRequestHandler)
64
de1a7499f4d6 Basic timeline provider for builds.
cmlenz
parents: 60
diff changeset
82
35
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
83 # INavigationContributor methods
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
84
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
85 def get_active_navigation_item(self, req):
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
86 return 'build'
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
87
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
88 def get_navigation_items(self, req):
50
0d5ad32948b7 Restrict access to web interface with custom permission actions.
cmlenz
parents: 47
diff changeset
89 if not req.perm.has_permission('BUILD_VIEW'):
0d5ad32948b7 Restrict access to web interface with custom permission actions.
cmlenz
parents: 47
diff changeset
90 return
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
91 yield 'mainnav', 'build', \
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
92 '<a href="%s" accesskey="5">Build Status</a>' \
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
93 % self.env.href.build()
35
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
94
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
95 # IRequestHandler methods
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
96
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
97 def match_request(self, req):
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
98 match = re.match(r'/build(?:/([\w.-]+))?$', req.path_info)
35
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
99 if match:
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
100 if match.group(1):
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
101 req.args['config'] = match.group(1)
35
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
102 return True
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
103
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
104 def process_request(self, req):
50
0d5ad32948b7 Restrict access to web interface with custom permission actions.
cmlenz
parents: 47
diff changeset
105 req.perm.assert_permission('BUILD_VIEW')
0d5ad32948b7 Restrict access to web interface with custom permission actions.
cmlenz
parents: 47
diff changeset
106
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
107 action = req.args.get('action')
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
108 config = req.args.get('config')
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
109
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
110 if req.method == 'POST':
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
111 if config:
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
112 if action == 'new':
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
113 self._do_create_platform(req, config)
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
114 else:
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
115 platform_id = req.args.get('platform')
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
116 if platform_id:
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
117 if action == 'edit':
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
118 self._do_save_platform(req, config, platform_id)
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
119 elif 'delete' in req.args:
74
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
120 self._do_delete_platforms(req)
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
121 self._render_config_form(req, config)
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
122 elif 'new' in req.args:
96
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
123 platform = TargetPlatform(self.env, config=config)
74
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
124 self._render_platform_form(req, platform)
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
125 else:
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
126 self._do_save_config(req, config)
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
127 else:
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
128 if action == 'new':
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
129 self._do_create_config(req)
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
130 else:
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
131 if config:
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
132 if action == 'edit':
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
133 platform_id = req.args.get('platform')
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
134 if platform_id:
96
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
135 platform = TargetPlatform.fetch(self.env,
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
136 int(platform_id))
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
137 self._render_platform_form(req, platform)
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
138 elif 'new' in req.args:
96
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
139 platform = TargetPlatform(self.env, config=config)
74
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
140 self._render_platform_form(req, platform)
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
141 else:
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
142 self._render_config_form(req, config)
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
143 else:
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
144 self._render_config(req, config)
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
145 else:
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
146 if action == 'new':
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
147 self._render_config_form(req)
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
148 else:
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
149 self._render_overview(req)
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
150
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
151 add_stylesheet(req, 'bitten.css')
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
152 return 'bitten_config.cs', None
64
de1a7499f4d6 Basic timeline provider for builds.
cmlenz
parents: 60
diff changeset
153
de1a7499f4d6 Basic timeline provider for builds.
cmlenz
parents: 60
diff changeset
154 # Internal methods
de1a7499f4d6 Basic timeline provider for builds.
cmlenz
parents: 60
diff changeset
155
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
156 def _do_create_config(self, req):
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
157 """Create a new build configuration."""
50
0d5ad32948b7 Restrict access to web interface with custom permission actions.
cmlenz
parents: 47
diff changeset
158 req.perm.assert_permission('BUILD_CREATE')
0d5ad32948b7 Restrict access to web interface with custom permission actions.
cmlenz
parents: 47
diff changeset
159
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
160 if 'cancel' in req.args:
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
161 req.redirect(self.env.href.build())
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
162
96
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
163 config = BuildConfig(self.env, name=req.args.get('name'),
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
164 path=req.args.get('path', ''),
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
165 label=req.args.get('label', ''),
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
166 active=req.args.has_key('active'),
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
167 description=req.args.get('description'))
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
168 config.insert()
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
169
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
170 req.redirect(self.env.href.build(config.name))
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
171
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
172 def _do_save_config(self, req, config_name):
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
173 """Save changes to a build configuration."""
50
0d5ad32948b7 Restrict access to web interface with custom permission actions.
cmlenz
parents: 47
diff changeset
174 req.perm.assert_permission('BUILD_MODIFY')
0d5ad32948b7 Restrict access to web interface with custom permission actions.
cmlenz
parents: 47
diff changeset
175
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
176 if 'cancel' in req.args:
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
177 req.redirect(self.env.href.build(config_name))
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
178
96
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
179 config = BuildConfig.fetch(self.env, config_name)
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
180 assert config, 'Build configuration "%s" does not exist' % config_name
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
181 config.name = req.args.get('name')
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
182 config.active = req.args.has_key('active')
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
183 config.label = req.args.get('label', '')
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
184 config.path = req.args.get('path', '')
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
185 config.description = req.args.get('description', '')
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
186 config.update()
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
187
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
188 req.redirect(self.env.href.build(config.name))
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
189
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
190 def _do_create_platform(self, req, config_name):
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
191 """Create a new target platform."""
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
192 req.perm.assert_permission('BUILD_MODIFY')
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
193
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
194 if 'cancel' in req.args:
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
195 req.redirect(self.env.href.build(config_name, action='edit'))
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
196
96
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
197 platform = TargetPlatform(self.env, config=config_name,
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
198 name=req.args.get('name'))
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
199
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
200 properties = [int(key[9:]) for key in req.args
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
201 if key.startswith('property_')]
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
202 properties.sort()
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
203 patterns = [int(key[8:]) for key in req.args
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
204 if key.startswith('pattern_')]
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
205 patterns.sort()
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
206 platform.rules = [(req.args.get('property_%d' % property),
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
207 req.args.get('pattern_%d' % pattern))
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
208 for property, pattern in zip(properties, patterns)]
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
209
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
210 add_rules = [int(key[9:]) for key in req.args
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
211 if key.startswith('add_rule_')]
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
212 if add_rules:
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
213 platform.rules.insert(add_rules[0] + 1, ('', ''))
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
214 self._render_platform_form(req, platform)
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
215 return
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
216 rm_rules = [int(key[8:]) for key in req.args
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
217 if key.startswith('rm_rule_')]
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
218 if rm_rules:
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
219 del platform.rules[rm_rules[0]]
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
220 self._render_platform_form(req, platform)
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
221 return
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
222
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
223 platform.insert()
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
224
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
225 req.redirect(self.env.href.build(config_name, action='edit'))
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
226
74
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
227 def _do_delete_platforms(self, req):
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
228 """Delete selected target platforms."""
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
229 req.perm.assert_permission('BUILD_MODIFY')
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
230 self.log.debug('_do_delete_platforms')
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
231
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
232 db = self.env.get_db_cnx()
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
233 for platform_id in [int(id) for id in req.args.get('delete_platform')]:
96
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
234 platform = TargetPlatform.fetch(self.env, platform_id, db=db)
74
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
235 self.log.info('Deleting target platform %s of configuration %s',
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
236 platform.name, platform.config)
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
237 platform.delete(db=db)
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
238 db.commit()
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
239
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
240 def _do_save_platform(self, req, config_name, platform_id):
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
241 """Save changes to a target platform."""
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
242 req.perm.assert_permission('BUILD_MODIFY')
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
243
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
244 if 'cancel' in req.args:
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
245 req.redirect(self.env.href.build(config_name, action='edit'))
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
246
96
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
247 platform = TargetPlatform.fetch(self.env, platform_id)
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
248 platform.name = req.args.get('name')
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
249
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
250 properties = [int(key[9:]) for key in req.args
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
251 if key.startswith('property_')]
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
252 properties.sort()
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
253 patterns = [int(key[8:]) for key in req.args
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
254 if key.startswith('pattern_')]
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
255 patterns.sort()
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
256 platform.rules = [(req.args.get('property_%d' % property),
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
257 req.args.get('pattern_%d' % pattern))
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
258 for property, pattern in zip(properties, patterns)]
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
259
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
260 add_rules = [int(key[9:]) for key in req.args
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
261 if key.startswith('add_rule_')]
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
262 if add_rules:
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
263 platform.rules.insert(add_rules[0] + 1, ('', ''))
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
264 self._render_platform_form(req, platform)
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
265 return
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
266 rm_rules = [int(key[8:]) for key in req.args
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
267 if key.startswith('rm_rule_')]
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
268 if rm_rules:
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
269 del platform.rules[rm_rules[0]]
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
270 self._render_platform_form(req, platform)
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
271 return
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
272
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
273 platform.update()
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
274
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
275 req.redirect(self.env.href.build(config_name, action='edit'))
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
276
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
277 def _render_overview(self, req):
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
278 req.hdf['title'] = 'Build Status'
45
80bc0fae3ed1 Renamed {{{Configuration}}} to {{{BuildConfig}}}.
cmlenz
parents: 41
diff changeset
279 configurations = BuildConfig.select(self.env, include_inactive=True)
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
280 for idx, config in enumerate(configurations):
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
281 description = config.description
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
282 if description:
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
283 description = wiki_to_html(description, self.env, req)
123
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
284 req.hdf['configs.%d' % idx] = {
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
285 'name': config.name, 'label': config.label or config.name,
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
286 'path': config.path, 'description': description,
123
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
287 'href': self.env.href.build(config.name),
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
288 }
123
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
289 req.hdf['page.mode'] = 'overview'
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
290 req.hdf['config.can_create'] = req.perm.has_permission('BUILD_CREATE')
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
291
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
292 def _render_config(self, req, config_name):
96
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
293 config = BuildConfig.fetch(self.env, config_name)
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
294 req.hdf['title'] = 'Build Configuration "%s"' \
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
295 % escape(config.label or config.name)
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
296 add_link(req, 'up', self.env.href.build(), 'Build Status')
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
297 description = config.description
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
298 if description:
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
299 description = wiki_to_html(description, self.env, req)
123
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
300 req.hdf['config'] = {
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
301 'name': config.name, 'label': config.label, 'path': config.path,
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
302 'active': config.active, 'description': description,
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
303 'browser_href': self.env.href.browser(config.path),
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
304 'can_modify': req.perm.has_permission('BUILD_MODIFY')
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
305 }
123
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
306 req.hdf['page.mode'] = 'view_config'
47
083e848088ee * Improvements to the model classes, and a couple of unit tests.
cmlenz
parents: 45
diff changeset
307
74
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
308 platforms = TargetPlatform.select(self.env, config=config_name)
123
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
309 req.hdf['config.platforms'] = [
76
ffa1ffd8c7db * Implement basic slave selection based on configured target platforms. Closes #15.
cmlenz
parents: 74
diff changeset
310 {'name': platform.name, 'id': platform.id} for platform in platforms
ffa1ffd8c7db * Implement basic slave selection based on configured target platforms. Closes #15.
cmlenz
parents: 74
diff changeset
311 ]
74
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
312
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
313 repos = self.env.get_repository(req.authname)
111
8d76fd3918a5 Don't just bail on the build configuration page if an invalid repository path is configured.
cmlenz
parents: 99
diff changeset
314 try:
8d76fd3918a5 Don't just bail on the build configuration page if an invalid repository path is configured.
cmlenz
parents: 99
diff changeset
315 root = repos.get_node(config.path)
8d76fd3918a5 Don't just bail on the build configuration page if an invalid repository path is configured.
cmlenz
parents: 99
diff changeset
316 for idx, (path, rev, chg) in enumerate(root.get_history()):
123
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
317 prefix = 'config.builds.%d' % rev
111
8d76fd3918a5 Don't just bail on the build configuration page if an invalid repository path is configured.
cmlenz
parents: 99
diff changeset
318 req.hdf[prefix + '.href'] = self.env.href.changeset(rev)
8d76fd3918a5 Don't just bail on the build configuration page if an invalid repository path is configured.
cmlenz
parents: 99
diff changeset
319 for build in Build.select(self.env, config=config.name, rev=rev):
8d76fd3918a5 Don't just bail on the build configuration page if an invalid repository path is configured.
cmlenz
parents: 99
diff changeset
320 if build.status == Build.PENDING:
8d76fd3918a5 Don't just bail on the build configuration page if an invalid repository path is configured.
cmlenz
parents: 99
diff changeset
321 continue
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
322 req.hdf['%s.%s' % (prefix, build.platform)] = _build_to_hdf(self.env, req, build)
111
8d76fd3918a5 Don't just bail on the build configuration page if an invalid repository path is configured.
cmlenz
parents: 99
diff changeset
323 if idx > 4:
8d76fd3918a5 Don't just bail on the build configuration page if an invalid repository path is configured.
cmlenz
parents: 99
diff changeset
324 break
8d76fd3918a5 Don't just bail on the build configuration page if an invalid repository path is configured.
cmlenz
parents: 99
diff changeset
325 except TracError, e:
8d76fd3918a5 Don't just bail on the build configuration page if an invalid repository path is configured.
cmlenz
parents: 99
diff changeset
326 self.log.error('Error accessing repository info', exc_info=True)
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
327
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
328 def _render_config_form(self, req, config_name=None):
96
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
329 config = BuildConfig.fetch(self.env, config_name)
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
330 if config:
50
0d5ad32948b7 Restrict access to web interface with custom permission actions.
cmlenz
parents: 47
diff changeset
331 req.perm.assert_permission('BUILD_MODIFY')
123
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
332 req.hdf['config'] = {
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
333 'name': config.name, 'label': config.label, 'path': config.path,
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
334 'active': config.active, 'description': config.description,
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
335 'exists': config.exists
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
336 }
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
337
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
338 req.hdf['title'] = 'Edit Build Configuration "%s"' \
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
339 % escape(config.label or config.name)
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
340 for idx, platform in enumerate(TargetPlatform.select(self.env,
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
341 config_name)):
123
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
342 req.hdf['config.platforms.%d' % idx] = {
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
343 'id': platform.id, 'name': platform.name,
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
344 'href': self.env.href.build(config_name, action='edit',
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
345 platform=platform.id)
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
346 }
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
347 else:
50
0d5ad32948b7 Restrict access to web interface with custom permission actions.
cmlenz
parents: 47
diff changeset
348 req.perm.assert_permission('BUILD_CREATE')
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
349 req.hdf['title'] = 'Create Build Configuration'
123
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
350 req.hdf['page.mode'] = 'edit_config'
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
351
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
352 def _render_platform_form(self, req, platform):
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
353 req.perm.assert_permission('BUILD_MODIFY')
74
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
354 if platform.exists:
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
355 req.hdf['title'] = 'Edit Target Platform "%s"' \
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
356 % escape(platform.name)
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
357 else:
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
358 req.hdf['title'] = 'Add Target Platform'
123
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
359 req.hdf['platform'] = {
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
360 'name': platform.name, 'id': platform.id, 'exists': platform.exists,
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
361 'rules': [{'property': propname, 'pattern': pattern}
80
dc1c7fc9b915 Record the output of build steps in the database. See #12. Still need to get better granularity in transmitting the log output from slave to master before #12 can be closed.
cmlenz
parents: 79
diff changeset
362 for propname, pattern in platform.rules] or [('', '')]
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
363 }
123
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
364 req.hdf['page.mode'] = 'edit_platform'
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
365
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
366
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
367 class BuildController(Component):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
368 """Renders the build page."""
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
369 implements(INavigationContributor, IRequestHandler, ITimelineEventProvider)
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
370
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
371 log_formatters = ExtensionPoint(ILogFormatter)
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
372
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
373 _level_label = {BuildLog.DEBUG: 'debug',
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
374 BuildLog.INFO: 'info',
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
375 BuildLog.WARNING: 'warning',
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
376 BuildLog.ERROR: 'error'}
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
377
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
378 # INavigationContributor methods
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
379
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
380 def get_active_navigation_item(self, req):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
381 return 'build'
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
382
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
383 def get_navigation_items(self, req):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
384 return []
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
385
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
386 # IRequestHandler methods
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
387
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
388 def match_request(self, req):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
389 match = re.match(r'/build/([\w.-]+)/([\d]+)', req.path_info)
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
390 if match:
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
391 if match.group(1):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
392 req.args['config'] = match.group(1)
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
393 if match.group(2):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
394 req.args['id'] = match.group(2)
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
395 return True
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
396
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
397 def process_request(self, req):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
398 req.perm.assert_permission('BUILD_VIEW')
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
399
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
400 db = self.env.get_db_cnx()
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
401 build_id = int(req.args.get('id'))
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
402 build = Build.fetch(self.env, build_id, db=db)
96
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
403 assert build, 'Build %s does not exist' % build_id
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
404
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
405 add_link(req, 'up', self.env.href.build(build.config),
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
406 'Build Configuration')
91
91db738c6a74 Fix status display for in-progress builds.
cmlenz
parents: 82
diff changeset
407 status2title = {Build.SUCCESS: 'Success', Build.FAILURE: 'Failure',
91db738c6a74 Fix status display for in-progress builds.
cmlenz
parents: 82
diff changeset
408 Build.IN_PROGRESS: 'In Progress'}
69
b92d7c7d70fd Record build slave properties in database.
cmlenz
parents: 67
diff changeset
409 req.hdf['title'] = 'Build %s - %s' % (build_id,
b92d7c7d70fd Record build slave properties in database.
cmlenz
parents: 67
diff changeset
410 status2title[build.status])
123
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
411 req.hdf['page.mode'] = 'view_build'
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
412 config = BuildConfig.fetch(self.env, build.config, db=db)
69
b92d7c7d70fd Record build slave properties in database.
cmlenz
parents: 67
diff changeset
413 req.hdf['build.config'] = {
b92d7c7d70fd Record build slave properties in database.
cmlenz
parents: 67
diff changeset
414 'name': config.label,
b92d7c7d70fd Record build slave properties in database.
cmlenz
parents: 67
diff changeset
415 'href': self.env.href.build(config.name)
b92d7c7d70fd Record build slave properties in database.
cmlenz
parents: 67
diff changeset
416 }
b92d7c7d70fd Record build slave properties in database.
cmlenz
parents: 67
diff changeset
417
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
418 req.hdf['build'] = _build_to_hdf(self.env, req, build)
80
dc1c7fc9b915 Record the output of build steps in the database. See #12. Still need to get better granularity in transmitting the log output from slave to master before #12 can be closed.
cmlenz
parents: 79
diff changeset
419 steps = []
112
a38eabd4b6e1 * Store build logs in a structured way, for example to highlight messages on the error stream.
cmlenz
parents: 111
diff changeset
420 for step in BuildStep.select(self.env, build=build.id, db=db):
80
dc1c7fc9b915 Record the output of build steps in the database. See #12. Still need to get better granularity in transmitting the log output from slave to master before #12 can be closed.
cmlenz
parents: 79
diff changeset
421 steps.append({
dc1c7fc9b915 Record the output of build steps in the database. See #12. Still need to get better granularity in transmitting the log output from slave to master before #12 can be closed.
cmlenz
parents: 79
diff changeset
422 'name': step.name, 'description': step.description,
123
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
423 'duration': pretty_timedelta(step.started, step.stopped),
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
424 'failed': step.status == BuildStep.FAILURE
80
dc1c7fc9b915 Record the output of build steps in the database. See #12. Still need to get better granularity in transmitting the log output from slave to master before #12 can be closed.
cmlenz
parents: 79
diff changeset
425 })
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
426 for log in BuildLog.select(self.env, build=build.id,
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
427 step=step.name, db=db):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
428 formatters = []
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
429 items = []
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
430 for formatter in self.log_formatters:
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
431 formatters.append(formatter.get_formatter(req, build,
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
432 step,
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
433 log.type))
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
434 for level, message in log.messages:
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
435 for format in formatters:
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
436 message = format(level, message)
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
437 items.append({'level': level, 'message': message})
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
438 steps[-1]['log'] = items
120
b63ed684c29c Show the list of reports generated on the build page.
cmlenz
parents: 114
diff changeset
439
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
440 store = ReportStore(self.env)
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
441 reports = []
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
442 for report in store.retrieve_reports(build, step):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
443 report_type = report.attr['type']
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
444 report_href = self.env.href.buildreport(build.id, step.name,
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
445 report_type)
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
446 reports.append({'type': report_type, 'href': report_href})
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
447 steps[-1]['reports'] = reports
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
448 req.hdf['build.steps'] = steps
120
b63ed684c29c Show the list of reports generated on the build page.
cmlenz
parents: 114
diff changeset
449
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
450 add_stylesheet(req, 'bitten.css')
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
451 return 'bitten_build.cs', None
80
dc1c7fc9b915 Record the output of build steps in the database. See #12. Still need to get better granularity in transmitting the log output from slave to master before #12 can be closed.
cmlenz
parents: 79
diff changeset
452
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
453 # ITimelineEventProvider methods
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
454
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
455 def get_timeline_filters(self, req):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
456 if req.perm.has_permission('BUILD_VIEW'):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
457 yield ('build', 'Builds')
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
458
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
459 def get_timeline_events(self, req, start, stop, filters):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
460 if 'build' in filters:
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
461 add_stylesheet(req, 'bitten.css')
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
462 db = self.env.get_db_cnx()
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
463 cursor = db.cursor()
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
464 cursor.execute("SELECT b.id,b.config,c.label,b.rev,p.name,b.slave,"
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
465 "b.stopped,b.status FROM bitten_build AS b"
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
466 " INNER JOIN bitten_config AS c ON (c.name=b.config)"
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
467 " INNER JOIN bitten_platform AS p ON (p.id=b.platform) "
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
468 "WHERE b.stopped>=%s AND b.stopped<=%s "
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
469 "AND b.status IN (%s, %s) ORDER BY b.stopped",
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
470 (start, stop, Build.SUCCESS, Build.FAILURE))
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
471 event_kinds = {Build.SUCCESS: 'successbuild',
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
472 Build.FAILURE: 'failedbuild'}
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
473 for id, config, label, rev, platform, slave, stopped, status in cursor:
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
474 title = 'Build of <em>%s [%s]</em> by %s (%s) %s' \
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
475 % (escape(label), escape(rev), escape(slave),
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
476 escape(platform), _status_label[status])
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
477 if req.args.get('format') == 'rss':
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
478 href = self.env.abs_href.build(config, id)
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
479 else:
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
480 href = self.env.href.build(config, id)
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
481 yield event_kinds[status], href, title, stopped, None, ''
114
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
482
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
483
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
484 class SourceFileLinkFormatter(Component):
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
485 """Finds references to files and directories in the repository in the build
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
486 log and renders them as links to the repository browser."""
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
487
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
488 implements(ILogFormatter)
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
489
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
490 def get_formatter(self, req, build, step, type):
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
491 config = BuildConfig.fetch(self.env, build.config)
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
492 repos = self.env.get_repository(req.authname)
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
493 nodes = []
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
494 def _walk(node):
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
495 for child in node.get_entries():
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
496 path = child.path[len(config.path) + 1:]
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
497 pattern = re.compile("([\s'\"])(%s)([\s'\"])" % re.escape(path))
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
498 nodes.append((child.path, pattern))
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
499 if child.isdir:
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
500 _walk(child)
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
501 _walk(repos.get_node(config.path, build.rev))
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
502 nodes.sort(lambda x, y: -cmp(len(x[0]), len(y[0])))
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
503
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
504 def _formatter(level, message):
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
505 for path, pattern in nodes:
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
506 def _replace(m):
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
507 return '%s<a href="%s">%s</a>%s' % (m.group(1),
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
508 self.env.href.browser(path, rev=build.rev),
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
509 m.group(2), m.group(3))
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
510 message = pattern.sub(_replace, message)
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
511 return message
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
512 return _formatter
128
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
513
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
514
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
515 class BuildReportController(Component):
128
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
516 """Temporary web interface that simply displays the XML source of a report
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
517 using the Trac `Mimeview` component."""
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
518
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
519 implements(INavigationContributor, IRequestHandler)
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
520
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
521 template_cs = """<?cs include:"header.cs" ?>
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
522 <div id="ctxtnav" class="nav"></div>
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
523 <div id="content" class="build">
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
524 <h1>Build <a href="<?cs var:build.href ?>"><?cs var:build.id ?></a>: <?cs
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
525 var:report.type ?></h1>
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
526 <?cs var:report.preview ?>
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
527 </div>
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
528 <?cs include:"footer.cs" ?>"""
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
529
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
530 # INavigationContributor methods
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
531
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
532 def get_active_navigation_item(self, req):
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
533 return 'build'
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
534
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
535 def get_navigation_items(self, req):
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
536 return []
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
537
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
538 # IRequestHandler methods
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
539
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
540 def match_request(self, req):
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
541 match = re.match(r'/buildreport/(?P<build>[\d]+)/(?P<step>[\w]+)'
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
542 r'/(?P<type>[\w]+)', req.path_info)
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
543 if match:
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
544 for name in match.groupdict():
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
545 req.args[name] = match.group(name)
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
546 return True
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
547
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
548 def process_request(self, req):
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
549 req.perm.assert_permission('BUILD_VIEW')
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
550
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
551 build = Build.fetch(self.env, int(req.args.get('build')))
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
552 if not build:
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
553 raise TracError, 'Build %d does not exist' % req.args.get('build')
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
554 step = BuildStep.fetch(self.env, build.id, req.args.get('step'))
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
555 if not step:
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
556 raise TracError, 'Build step %s does not exist' \
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
557 % req.args.get('step')
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
558 report_type = req.args.get('type')
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
559
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
560 req.hdf['build'] = {'id': build.id,
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
561 'href': self.env.href.build(build.config, build.id)}
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
562
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
563 store = ReportStore(self.env)
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
564 reports = []
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
565 for report in store.retrieve_reports(build, step, report_type):
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
566 req.hdf['title'] = 'Build %d: %s' % (build.id, report_type)
138
f34d2b9d9556 Add plain XML view of reports.
cmlenz
parents: 128
diff changeset
567 xml = report._node.toprettyxml(' ')
f34d2b9d9556 Add plain XML view of reports.
cmlenz
parents: 128
diff changeset
568 if req.args.get('format') == 'xml':
f34d2b9d9556 Add plain XML view of reports.
cmlenz
parents: 128
diff changeset
569 req.send_response(200)
f34d2b9d9556 Add plain XML view of reports.
cmlenz
parents: 128
diff changeset
570 req.send_header('Content-Type', 'text/xml;charset=utf-8')
f34d2b9d9556 Add plain XML view of reports.
cmlenz
parents: 128
diff changeset
571 req.end_headers()
f34d2b9d9556 Add plain XML view of reports.
cmlenz
parents: 128
diff changeset
572 req.write(xml)
f34d2b9d9556 Add plain XML view of reports.
cmlenz
parents: 128
diff changeset
573 return
f34d2b9d9556 Add plain XML view of reports.
cmlenz
parents: 128
diff changeset
574 else:
f34d2b9d9556 Add plain XML view of reports.
cmlenz
parents: 128
diff changeset
575 from trac.mimeview import Mimeview
f34d2b9d9556 Add plain XML view of reports.
cmlenz
parents: 128
diff changeset
576 preview = Mimeview(self.env).render(req, 'application/xml', xml)
f34d2b9d9556 Add plain XML view of reports.
cmlenz
parents: 128
diff changeset
577 req.hdf['report'] = {'type': report_type, 'preview': preview}
128
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
578 break
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
579
138
f34d2b9d9556 Add plain XML view of reports.
cmlenz
parents: 128
diff changeset
580 xml_href = self.env.href.buildreport(build.id, step.name, report_type,
f34d2b9d9556 Add plain XML view of reports.
cmlenz
parents: 128
diff changeset
581 format='xml')
f34d2b9d9556 Add plain XML view of reports.
cmlenz
parents: 128
diff changeset
582 add_link(req, 'alternate', xml_href, 'XML', 'text/xml')
128
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
583 add_stylesheet(req, 'css/code.css')
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
584 template = req.hdf.parse(self.template_cs)
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
585 return template, None
Copyright (C) 2012-2017 Edgewall Software