Skip to content

Commit

Permalink
Fix where days/weeks/... reverted to days when sorting columns.
Browse files Browse the repository at this point in the history
Refactored time_period code into function.
Applied sparklines to workflows pages.
  • Loading branch information
Airistotal committed Jun 26, 2015
1 parent 1c7017c commit 88471eb
Show file tree
Hide file tree
Showing 10 changed files with 155 additions and 55 deletions.
57 changes: 20 additions & 37 deletions lib/galaxy/webapps/reports/controllers/jobs.py
Expand Up @@ -52,6 +52,22 @@ def sorter(default_sort_id, kwd):

return SortSpec(sort_id, order, arrow, _order)

def get_spark_time( time_period ):
_time_period = 0

if time_period == "days":
_time_period = 1.0
elif time_period == "weeks":
_time_period = 7.0
elif time_period == "months":
_time_period = 30.0
elif time_period == "years":
_time_period = 365.0
else:
time_period = "days"
_time_period = 1.0

return time_period, _time_period

class SpecifiedDateListGrid( grids.Grid ):

Expand Down Expand Up @@ -454,10 +470,8 @@ def per_month_all( self, trans, **kwd ):

jobs = []
for row in jobs_by_month.execute():
month = int(row.date.strftime("%-m"))
month_name = row.date.strftime("%B")
year = int(row.date.strftime("%Y"))
wday, day_range = calendar.monthrange(year, month)

jobs.append( (
row.date.strftime( "%Y-%m" ),
Expand Down Expand Up @@ -557,17 +571,7 @@ def per_user( self, trans, **kwd ):
arrow = specs.arrow
_order = specs.exc_order
time_period = kwd.get('spark_time')
if time_period == "days":
_time_period = 1.0
elif time_period == "weeks":
_time_period = 7.0
elif time_period == "months":
_time_period = 30.0
elif time_period == "years":
_time_period = 365.0
else:
time_period = "days"
_time_period = 1.0
time_period, _time_period = get_spark_time( time_period )
limit = 30

jobs = []
Expand Down Expand Up @@ -689,18 +693,7 @@ def per_tool( self, trans, **kwd ):
arrow = specs.arrow
_order = specs.exc_order
time_period = kwd.get('spark_time')
if time_period == "days":
_time_period = 1.0
elif time_period == "weeks":
_time_period = 7.0
elif time_period == "months":
_time_period = 30.0
elif time_period == "years":
_time_period = 365.0
else:
time_period = "days"
_time_period = 1.0

time_period, _time_period = get_spark_time( time_period )
limit = 30

# In case we don't know which is the monitor user we will query for all jobs
Expand Down Expand Up @@ -770,19 +763,9 @@ def errors_per_tool( self, trans, **kwd ):
arrow = specs.arrow
_order = specs.exc_order
time_period = kwd.get('spark_time')
if time_period == "days":
_time_period = 1.0
elif time_period == "weeks":
_time_period = 7.0
elif time_period == "months":
_time_period = 30.0
elif time_period == "years":
_time_period = 365.0
else:
time_period = "days"
_time_period = 1.0

time_period, _time_period = get_spark_time( time_period )
limit = 30

# In case we don't know which is the monitor user we will query for all jobs
monitor_user_id = get_monitor_id( trans, monitor_email )

Expand Down
95 changes: 90 additions & 5 deletions lib/galaxy/webapps/reports/controllers/workflows.py
@@ -1,14 +1,16 @@
import calendar
from datetime import date, timedelta
from datetime import datetime, date, timedelta
from galaxy import eggs
from galaxy import model, util
from galaxy.model.orm import and_
from math import floor
from galaxy.web.base.controller import BaseUIController, web
from galaxy.web.framework.helpers import grids
eggs.require( "SQLAlchemy >= 0.4" )
import re
import sqlalchemy as sa
from galaxy.webapps.reports.controllers.query import ReportQueryBuilder
from galaxy.webapps.reports.controllers.jobs import sorter
from galaxy.webapps.reports.controllers.jobs import sorter, get_spark_time

import logging
log = logging.getLogger( __name__ )
Expand Down Expand Up @@ -152,20 +154,46 @@ def per_month_all( self, trans, **kwd ):
order = specs.order
arrow = specs.arrow
_order = specs.exc_order
q = sa.select( ( self.select_month( model.StoredWorkflow.table.c.create_time ).label( 'date' ), sa.func.count( model.StoredWorkflow.table.c.id ).label( 'total_workflows' ) ),

q = sa.select( ( self.select_month( model.StoredWorkflow.table.c.create_time ).label( 'date' ),
sa.func.count( model.StoredWorkflow.table.c.id ).label( 'total_workflows' ) ),
from_obj=[ sa.outerjoin( model.StoredWorkflow.table, model.User.table ) ],
group_by=self.group_by_month( model.StoredWorkflow.table.c.create_time ),
order_by=[ _order ] )

all_workflows = sa.select( ( self.select_day( model.StoredWorkflow.table.c.create_time ).label( 'date' ),
model.StoredWorkflow.table.c.id ) )

trends = dict()
for workflow in all_workflows.execute():
workflow_day = int(workflow.date.strftime("%-d")) - 1
workflow_month = int(workflow.date.strftime("%-m"))
workflow_month_name = workflow.date.strftime("%B")
workflow_year = workflow.date.strftime("%Y")
key = str( workflow_month_name + workflow_year)

try:
trends[key][workflow_day] += 1
except KeyError:
workflow_year = int(workflow_year)
wday, day_range = calendar.monthrange(workflow_year, workflow_month)
trends[key] = [0] * day_range
trends[key][workflow_day] += 1

workflows = []
for row in q.execute():
month_name = row.date.strftime("%B")
year = int(row.date.strftime("%Y"))

workflows.append( ( row.date.strftime( "%Y-%m" ),
row.total_workflows,
row.date.strftime( "%B" ),
row.date.strftime( "%Y" ) ) )
month_name,
year ) )
return trans.fill_template( '/webapps/reports/workflows_per_month_all.mako',
order=order,
arrow=arrow,
sort_id=sort_id,
trends=trends,
workflows=workflows,
message=message )

Expand All @@ -177,19 +205,52 @@ def per_user( self, trans, **kwd ):
order = specs.order
arrow = specs.arrow
_order = specs.exc_order
time_period = kwd.get('spark_time')
time_period, _time_period = get_spark_time( time_period )
limit=30

workflows = []
q = sa.select( ( model.User.table.c.email.label( 'user_email' ),
sa.func.count( model.StoredWorkflow.table.c.id ).label( 'total_workflows' ) ),
from_obj=[ sa.outerjoin( model.StoredWorkflow.table, model.User.table ) ],
group_by=[ 'user_email' ],
order_by=[ _order ] )

all_workflows_per_user = sa.select( ( model.User.table.c.email.label( 'user_email' ),
self.select_day( model.StoredWorkflow.table.c.create_time ).label('date'),
model.StoredWorkflow.table.c.id ),
from_obj=[ sa.outerjoin( model.StoredWorkflow.table,
model.User.table ) ] )
currday = datetime.today()
trends = dict()
for workflow in all_workflows_per_user.execute():
curr_user = re.sub(r'\W+', '', workflow.user_email)
try:
day = currday - workflow.date
except TypeError:
day = datetime.date(currday) - datetime.date(workflow.date)

day = day.days
container = floor(day / _time_period)
container = int(container)
try:
if container < limit:
trends[curr_user][container] += 1
except KeyError:
trends[curr_user] = [0] * limit
if container < limit:
trends[curr_user][container] += 1

for row in q.execute():
workflows.append( ( row.user_email,
row.total_workflows ) )
return trans.fill_template( '/webapps/reports/workflows_per_user.mako',
order=order,
arrow=arrow,
sort_id=sort_id,
limit=limit,
trends=trends,
time_period=time_period,
workflows=workflows,
message=message )

Expand All @@ -204,12 +265,35 @@ def user_per_month( self, trans, **kwd ):
_order = specs.exc_order
email = util.restore_text( params.get( 'email', '' ) )
user_id = trans.security.decode_id( params.get( 'id', '' ) )

q = sa.select( ( self.select_month( model.StoredWorkflow.table.c.create_time ).label( 'date' ),
sa.func.count( model.StoredWorkflow.table.c.id ).label( 'total_workflows' ) ),
whereclause=model.StoredWorkflow.table.c.user_id == user_id,
from_obj=[ model.StoredWorkflow.table ],
group_by=self.group_by_month( model.StoredWorkflow.table.c.create_time ),
order_by=[ _order ] )

all_workflows_user_month = sa.select( ( self.select_day( model.StoredWorkflow.table.c.create_time ).label( 'date' ),
model.StoredWorkflow.table.c.id ),
whereclause=model.StoredWorkflow.table.c.user_id == user_id,
from_obj=[ model.StoredWorkflow.table ] )

trends = dict()
for workflow in all_workflows_user_month.execute():
workflow_day = int(workflow.date.strftime("%-d")) - 1
workflow_month = int(workflow.date.strftime("%-m"))
workflow_month_name = workflow.date.strftime("%B")
workflow_year = workflow.date.strftime("%Y")
key = str( workflow_month_name + workflow_year)

try:
trends[key][workflow_day] += 1
except KeyError:
workflow_year = int(workflow_year)
wday, day_range = calendar.monthrange(workflow_year, workflow_month)
trends[key] = [0] * day_range
trends[key][workflow_day] += 1

workflows = []
for row in q.execute():
workflows.append( ( row.date.strftime( "%Y-%m" ),
Expand All @@ -221,6 +305,7 @@ def user_per_month( self, trans, **kwd ):
order=order,
arrow=arrow,
sort_id=sort_id,
trends=trends,
workflows=workflows,
message=message )

Expand Down
2 changes: 1 addition & 1 deletion templates/webapps/reports/index.mako
Expand Up @@ -53,7 +53,7 @@
<div class="toolTitle"><a target="galaxy_main" href="${h.url_for( controller='jobs', action='per_month_in_error', sort_id='default', order='default' )}">Jobs in error per month</a></div>
<div class="toolTitle"><a target="galaxy_main" href="${h.url_for( controller='jobs', action='per_user', sort_id='default', order='default' )}">Jobs per user</a></div>
<div class="toolTitle"><a target="galaxy_main" href="${h.url_for( controller='jobs', action='per_tool', sort_id='default', order='default' )}">Jobs per tool</a></div>
<div class="toolTitle"><a target="galaxy_main" href="${h.url_for( controller='jobs', action='errors_per_tool', sort_id='default', order='default')}">Errors per tool</a></div>
<div class="toolTitle"><a target="galaxy_main" href="${h.url_for( controller='jobs', action='errors_per_tool', sort_id='default', order='default', spark_time='')}">Errors per tool</a></div>
</div>
</div>
<div class="toolSectionPad"></div>
Expand Down
6 changes: 3 additions & 3 deletions templates/webapps/reports/jobs_errors_per_tool.mako
Expand Up @@ -28,17 +28,17 @@ ${get_css()}
%else:
<tr class="header">
<td>
${get_sort_url(sort_id, order, 'tool_id', 'jobs', 'errors_per_tool', 'Tool ID')}
${get_sort_url(sort_id, order, 'tool_id', 'jobs', 'errors_per_tool', 'Tool ID', spark_time=time_period)}
<span class='dir_arrow tool_id'>${arrow}</span>
</td>
%if is_user_jobs_only:
<td>
${get_sort_url(sort_id, order, 'total_jobs', 'jobs', 'errors_per_tool', 'User Jobs in Error')}
${get_sort_url(sort_id, order, 'total_jobs', 'jobs', 'errors_per_tool', 'User Jobs in Error', spark_time=time_period)}
<span class='dir_arrow total_jobs'>${arrow}</span>
</td>
%else:
<td>
${get_sort_url(sort_id, order, 'total_jobs', 'jobs', 'errors_per_tool', 'User and Monitor Jobs in Error')}
${get_sort_url(sort_id, order, 'total_jobs', 'jobs', 'errors_per_tool', 'User and Monitor Jobs in Error', spark_time=time_period)}
<span class='dir_arrow total_jobs'>${arrow}</span>
</td>
%endif
Expand Down
6 changes: 3 additions & 3 deletions templates/webapps/reports/jobs_per_tool.mako
Expand Up @@ -27,17 +27,17 @@ ${get_css()}
%else:
<tr class="header">
<td>
${get_sort_url(sort_id, order, 'tool_id', 'jobs', 'per_tool', 'Tool ID')}
${get_sort_url(sort_id, order, 'tool_id', 'jobs', 'per_tool', 'Tool ID', spark_time=time_period)}
<span class='dir_arrow tool_id'>${arrow}</span>
</td>
%if is_user_jobs_only:
<td>
${get_sort_url(sort_id, order, 'total_jobs', 'jobs', 'per_tool', 'User Jobs')}
${get_sort_url(sort_id, order, 'total_jobs', 'jobs', 'per_tool', 'User Jobs', spark_time=time_period)}
<span class='dir_arrow total_jobs'>${arrow}</span>
</td>
%else:
<td>
${get_sort_url(sort_id, order, 'total_jobs', 'jobs', 'per_tool', 'User and Monitor Jobs')}
${get_sort_url(sort_id, order, 'total_jobs', 'jobs', 'per_tool', 'User and Monitor Jobs', spark_time=time_period)}
<span class='dir_arrow total_jobs'>${arrow}</span>
</td>
%endif
Expand Down
4 changes: 2 additions & 2 deletions templates/webapps/reports/jobs_per_user.mako
Expand Up @@ -27,11 +27,11 @@ ${get_css()}
%else:
<tr class="header">
<td>
${get_sort_url(sort_id, order, 'user_email', 'jobs', 'per_user', 'User')}
${get_sort_url(sort_id, order, 'user_email', 'jobs', 'per_user', 'User', spark_time=time_period)}
<span class='dir_arrow user_email'>${arrow}</span>
</td>
<td>
${get_sort_url(sort_id, order, 'total_jobs', 'jobs', 'per_user', 'Total Jobs')}
${get_sort_url(sort_id, order, 'total_jobs', 'jobs', 'per_user', 'Total Jobs', spark_time=time_period)}
<span class='dir_arrow total_jobs'>${arrow}</span>
</td>
</tr>
Expand Down
4 changes: 3 additions & 1 deletion templates/webapps/reports/jobs_user_per_month.mako
Expand Up @@ -3,7 +3,9 @@
<%namespace file="/spark_base.mako" import="jqs_style, make_sparkline" />
<%namespace file="/sorting_base.mako" import="get_sort_url, get_css" />

<% from galaxy import util %>
<%
from galaxy import util
%>

%if message:
${render_msg( message, 'done' )}
Expand Down
9 changes: 9 additions & 0 deletions templates/webapps/reports/workflows_per_month_all.mako
@@ -1,11 +1,14 @@
<%inherit file="/base.mako"/>
<%namespace file="/message.mako" import="render_msg" />
<%namespace file="/sorting_base.mako" import="get_sort_url, get_css" />
<%namespace file="/spark_base.mako" import="jqs_style, make_sparkline, make_spark_settings, spark_css" />

%if message:
${render_msg( message, 'done' )}
%endif

${spark_css()}
${jqs_style()}
${get_css()}

<div class="toolForm">
Expand All @@ -27,6 +30,7 @@ ${get_css()}
</tr>
<% ctr = 0 %>
%for workflow in workflows:
<% key = str(workflow[2]) + str(workflow[3]) %>
<%
month = workflow[0]
total = workflow[1]
Expand All @@ -38,6 +42,11 @@ ${get_css()}
%endif
<td>${month}</td>
<td>${total}</td>
%try:
${make_sparkline(key, trends[key], "bar", "/ day")}
%except KeyError:
%endtry
<td id=${key}></td>
</tr>
<% ctr += 1 %>
%endfor
Expand Down

0 comments on commit 88471eb

Please sign in to comment.