Index: extendedversion/htdocs/css/roadmap.css
===================================================================
--- extendedversion/htdocs/css/roadmap.css (revision 0)
+++ extendedversion/htdocs/css/roadmap.css (revision 0)
@@ -0,0 +1,3 @@
+.milestone .milestones {
+ border: 1px solid lightgray;
+}
\ No newline at end of file
Index: extendedversion/htdocs/css/version.css
===================================================================
--- extendedversion/htdocs/css/version.css (revision 13299)
+++ extendedversion/htdocs/css/version.css (working copy)
@@ -14,4 +14,7 @@
.milestone .info h3 :link:hover, .milestone .info h3 :visited:hover {
color: #000;
}
-.milestone .info h3 em { color: #b00; font-style: normal }
\ No newline at end of file
+.milestone .info h3 em { color: #b00; font-style: normal }
+.milestone .milestones {
+ border: 1px solid lightgray;
+}
\ No newline at end of file
Index: extendedversion/roadmap.py
===================================================================
--- extendedversion/roadmap.py (revision 13299)
+++ extendedversion/roadmap.py (working copy)
@@ -20,14 +20,18 @@
from trac.web.chrome import(
INavigationContributor, add_stylesheet
)
+from version import VisibleVersion
-
class ReleasesModule(Component):
implements(INavigationContributor, IRequestHandler, IRequestFilter)
roadmap_navigation = BoolOption('extended_version', 'roadmap_navigation',
'false', doc="""Whether to have the roadmap navigation item link to
the versions page.""")
+ show_tickets_in_overview = BoolOption('extended_version', 'show_tickets_in_overview', True,
+ """whether to display the ticket bars in the version overview page.""")
+ show_milestones_in_overview = BoolOption('extended_version', 'show_milestones_in_overview', False,
+ """whether to display milestone information in the overview page.""")
# INavigationContributor methods
def get_active_navigation_item(self, req):
@@ -58,32 +62,46 @@
def process_request(self, req):
req.perm.require('VERSION_VIEW')
+ db = self.env.get_db_cnx()
+
showall = req.args.get('show') == 'all'
+ version_component = self.env[VisibleVersion]
+ milestone_stats_provider = version_component.milestone_stats_provider
+ version_stats_provider = version_component.version_stats_provider
versions = []
resources = []
is_released = []
+ version_datasets = []
for v in Version.select(self.env):
r = Resource('version', v.name)
ir = v.time and v.time.date() < date.today()
- # apply more visibiity
+ # apply more visibility
if (showall or not ir) and 'VERSION_VIEW' in req.perm(r):
versions.append(v)
resources.append(r)
is_released.append(v.time and v.time.date() < date.today())
+ version_data = version_component.get_version_data(req, db, v)
+ version_datasets.append(version_data)
versions.reverse(),
resources.reverse(),
is_released.reverse(),
+ version_datasets.reverse(),
data = {
'versions': versions,
'resources': resources,
'is_released': is_released,
'showall': showall,
+ 'show_tickets_in_overview' : self.show_tickets_in_overview,
+ 'show_milestones_in_overview' : self.show_milestones_in_overview,
+ 'version_datasets' : version_datasets,
}
add_stylesheet(req, 'common/css/roadmap.css')
+ add_stylesheet(req, 'extendedversion/css/roadmap.css')
+
return 'versions.html', data, None
def _remove_item(self, req, name):
Index: extendedversion/version.py
===================================================================
--- extendedversion/version.py (revision 13299)
+++ extendedversion/version.py (working copy)
@@ -137,7 +137,7 @@
# IRequestHandler methods
def match_request(self, req):
- match = re.match(r'/version[/^s]?(?:(.+))?', req.path_info)
+ match = re.match(r'/version(?:/(.+))?$', req.path_info)
if match:
if match.group(1):
req.args['id'] = match.group(1)
@@ -219,6 +219,43 @@
def get_link_resolvers(self):
yield ('version', self._format_link)
+
+ # Utility methods
+ def get_version_data(self, req, db, version):
+
+ sql = "SELECT name,due,completed,description FROM milestone " \
+ "INNER JOIN milestone_version ON (name = milestone) " \
+ "WHERE version = %s " \
+ "ORDER BY name "
+ cursor = db.cursor()
+ cursor.execute(sql, (version.name,))
+
+ milestones = []
+ tickets = []
+ milestone_stats = []
+
+ for row in cursor:
+ milestone = Milestone(self.env, row[0])
+ milestones.append(milestone)
+
+ mtickets = get_tickets_for_milestone(self.env, db, milestone.name,
+ 'owner')
+
+ mtickets = apply_ticket_permissions(self.env, req, mtickets)
+ tickets += mtickets
+ stat = get_ticket_stats(self.milestone_stats_provider, mtickets)
+ milestone_stats.append(milestone_stats_data(self.env, req, stat, milestone.name))
+
+ stats = get_ticket_stats(self.version_stats_provider, tickets)
+ interval_hrefs = version_interval_hrefs(self.env, req, stats, [ milestone.name for milestone in milestones ])
+ data = {
+ 'stats' : stats,
+ 'interval_hrefs' : interval_hrefs,
+ 'milestones' : milestones,
+ 'milestone_stats' : milestone_stats,
+ }
+ return data
+
# Internal methods
def _do_delete(self, req, db, version):
@@ -357,46 +394,20 @@
def _render_view(self, req, db, version):
- db = self.env.get_db_cnx()
- sql = "SELECT name FROM milestone " \
- "INNER JOIN milestone_version ON (name = milestone) " \
- "WHERE version = %s " \
- "ORDER BY due"
- cursor = db.cursor()
- cursor.execute(sql, (version.name,))
-
- milestones = []
- tickets = []
- milestone_stats = []
-
- for row in cursor:
- milestone = Milestone(self.env, row[0])
- milestones.append(milestone)
-
- mtickets = get_tickets_for_milestone(self.env, db, milestone.name,
- 'owner')
- mtickets = apply_ticket_permissions(self.env, req, mtickets)
- tickets += mtickets
- stat = get_ticket_stats(self.milestone_stats_provider, mtickets)
- milestone_stats.append(milestone_stats_data(self.env, req, stat, milestone.name))
-
- stats = get_ticket_stats(self.version_stats_provider, tickets)
- interval_hrefs = version_interval_hrefs(self.env, req, stats,
- [milestone.name for milestone in milestones])
-
+ version_data = self.get_version_data(req, db, version)
version.resource = Resource('version', version.name)
context = Context.from_request(req, version.resource)
version.is_released = version.time and version.time.date() < date.today()
- version.stats = stats
- version.interval_hrefs = interval_hrefs
+ version.stats = version_data['stats']
+ version.interval_hrefs = version_data['interval_hrefs']
version.stats_href = [] # Not implemented yet, see th:#10349
data = {
'context': context,
'version': version,
'attachments': AttachmentModule(self.env).attachment_data(context),
- 'milestones': milestones,
- 'milestone_stats': milestone_stats,
+ 'milestones': version_data['milestones'],
+ 'milestone_stats': version_data['milestone_stats'],
'show_milestone_description': self.show_milestone_description # Not implemented yet
}
Index: extendedversion/templates/versions.html
===================================================================
--- extendedversion/templates/versions.html (revision 13299)
+++ extendedversion/templates/versions.html (working copy)
@@ -28,7 +28,7 @@
-
-
+
@@ -45,12 +45,39 @@
No date set
+
+
+
+ Milestone tickets
+ |
+
+ ${progress_bar(version_datasets[idx].stats, version_datasets[idx].interval_hrefs)}
+ |
+
+
${wiki_to_html(context(resources[idx]), version.description)}
+
+
Milestones
+
+
+
+
+
+ ${milestone.name}
+
+ |
+
+ ${progress_bar(mstats.stats, mstats.interval_hrefs, legend=False, stats_href=mstats.stats_href)}
+ |
+
+
+
+