Browse files

new UI for b2g

  • Loading branch information...
1 parent cd81a88 commit e122d26dd2794ea424f7d6f63cb204f4b66dc0ed @jeads jeads committed Jan 28, 2013
View
11 datazilla/controller/admin/refdata/objectstore_refdata.py
@@ -29,6 +29,17 @@ def get_json_blob(project, id):
return {}
+def get_json_blob_by_test_run_id(project, test_run_id):
+ """Based on the test_run_id passed in, return the JSON blob"""
+ ptm = PerformanceTestRefDataModel(project)
+ blob = ptm.get_object_json_blob_for_test_run([test_run_id])
+ ptm.disconnect()
+
+ if blob:
+ return blob[0]
+
+ return {}
+
def get_error_detail_count(project, startdate, enddate):
"""Return counts attempting to parse some of the bad JSON to extract details."""
View
11 datazilla/controller/admin/testdata.py
@@ -233,5 +233,16 @@ def get_default_version(project, branch, product_name):
return version
+def get_test_value_summary(project, test_ids, url, begin, now):
+
+ ptm = factory.get_ptm(project)
+
+ data = ptm.get_value_summary_by_test_ids(
+ test_ids, url, begin, now
+ )
+
+ ptm.disconnect()
+
+ return data
View
38 datazilla/model/base.py
@@ -776,13 +776,21 @@ def get_pages(self):
proc = 'perftest.selects.get_pages'
- pages_dict = self.sources["perftest"].dhub.execute(
+ pages_tuple = self.sources["perftest"].dhub.execute(
proc=proc,
debug_show=self.DEBUG,
- key_column='url',
- return_type='dict',
)
+ pages_dict = {}
+ for page_data in pages_tuple:
+ if page_data['url'] not in pages_dict:
+ pages_dict[ page_data['url'] ] = {}
+ pages_dict[ page_data['url'] ]['test_ids'] = {}
+ pages_dict[ page_data['url'] ]['id'] = page_data['id']
+ pages_dict[ page_data['url'] ]['url'] = page_data['url']
+
+ pages_dict[ page_data['url'] ]['test_ids'][ page_data['test_id'] ] = True
+
return pages_dict
@@ -958,6 +966,30 @@ def get_test_run_value_summary(self, test_run_id):
return test_run_value_table
+ def get_value_summary_by_test_ids(
+ self, test_ids, url, begin_date, end_date
+ ):
+
+ data = []
+
+ if test_ids and url and begin_date and end_date:
+
+ proc = 'perftest.selects.get_value_summary_by_test_id'
+
+ r_string = ','.join( map( lambda t_id: '%s', test_ids ) )
+
+ test_ids.append( url )
+ test_ids.append( begin_date )
+ test_ids.append( end_date )
+
+ data = self.sources["perftest"].dhub.execute(
+ proc=proc,
+ debug_show=self.DEBUG,
+ placeholders=test_ids,
+ replace=[ r_string ]
+ )
+
+ return data
def get_test_run_ids(
self, branch, revisions, product_name=None, os_name=None,
View
28 datazilla/model/sql/perftest.json
@@ -525,6 +525,34 @@
"host":"read_host"
},
+ "get_value_summary_by_test_id":{
+
+ "sql":"SELECT tv.test_run_id,
+ tv.page_id,
+ tr.revision,
+ tr.test_id,
+ tr.date_run,
+ b.product_id,
+ tr.test_id,
+ m.operating_system_id,
+ p.url,
+ ROUND( AVG(tv.value), 2 ) AS avg,
+ ROUND( MIN(tv.value), 2 ) AS min,
+ ROUND( MAX(tv.value), 2 ) AS max,
+ ROUND( STDDEV(tv.value), 2 ) AS 'std'
+ FROM test_value AS tv
+ LEFT JOIN pages AS p ON tv.page_id = p.id
+ LEFT JOIN value AS v ON tv.value_id = v.id
+ LEFT JOIN test_run AS tr ON tv.test_run_id = tr.id
+ LEFT JOIN machine AS m ON tr.machine_id = m.id
+ LEFT JOIN build AS b ON tr.build_id = b.id
+ WHERE tr.test_id IN (REP0) AND p.url = ? AND tr.date_run >= ? AND tr.date_run <= ?
+ GROUP BY tr.id, p.url
+ ORDER BY tr.id DESC",
+
+ "host":"read_host"
+
+ },
"get_page_values":{
"sql":"SELECT tv.id AS test_value_id,
View
3 datazilla/settings/local.sample.py
@@ -22,6 +22,9 @@
# base URL
DATAZILLA_URL = os.environ.get("DATAZILLA_URL", "/")
+#pipe delimited list of allowed project names, defaults to \w+ if not set
+ALLOWED_PROJECTS = os.environ.get("ALLOWED_PROJECTS", "")
+
# This should always be False in production
DEBUG = os.environ.get("DATAZILLA_DEBUG") is not None
View
24 datazilla/webapp/apps/datazilla/refdata/objectstore_views.py
@@ -35,7 +35,7 @@ def get_error_count(request, project):
def get_json_blob(request, project, id):
- """Return a count of all objectstore entries with error"""
+ """Return a json object for the objectstore id provided"""
blob = objectstore_refdata.get_json_blob(project, id)
@@ -55,6 +55,28 @@ def get_json_blob(request, project, id):
else:
return HttpResponse("Id not found: {0}".format(id), status=404)
+def get_json_blob_by_test_run_id(request, project, test_run_id):
+ """Return a json object for the test_run_id provided"""
+
+ blob = objectstore_refdata.get_json_blob_by_test_run_id(
+ project, test_run_id)
+
+ if blob:
+
+ # If we don't have malformed json load it so we can return
+ # a single json data structure with all fields present including
+ # json_blob. Malformed json will be returned as an escaped
+ # string.
+ try:
+ blob['json_blob'] = json.loads(blob['json_blob'])
+ except ValueError as e:
+ pass
+
+ return HttpResponse(json.dumps(blob), content_type=API_CONTENT_TYPE)
+
+ else:
+ return HttpResponse("Id not found: {0}".format(id), status=404)
+
def get_db_size(request, project):
"""Return the size of the DB on disk in MB."""
View
2 datazilla/webapp/apps/datazilla/refdata/urls.py
@@ -10,6 +10,8 @@
(r"^objectstore/json_blob/(?P<id>\d+)/?$", "objectstore_views.get_json_blob"),
+ (r"^objectstore/json_blob/test_run/(?P<test_run_id>\d+)/?$", "objectstore_views.get_json_blob_by_test_run_id"),
+
(r"^objectstore/db_size/?$", "objectstore_views.get_db_size"),
# perftest
View
2 datazilla/webapp/apps/datazilla/testdata/urls.py
@@ -5,6 +5,8 @@
(r"^raw/(?P<branch>.+)/(?P<revision>\w+)/?$", "views.get_testdata"),
+ (r"^test_values/?$", "views.get_test_value_summary"),
+
(r"^metrics/(?P<branch>.+)/(?P<revision>\w+)/pushlog/?$",
"views.get_metrics_pushlog"),
View
26 datazilla/webapp/apps/datazilla/testdata/views.py
@@ -1,8 +1,10 @@
import json
+import time
from django.http import HttpResponse
from datazilla.controller.admin import testdata
+from datazilla.model import utils
REQUIRE_DAYS_AGO = """Invalid Request: Require days_ago parameter.
This specifies the number of days ago to use as the start
@@ -213,5 +215,29 @@ def get_application_log(request, project, revision):
content_type=API_CONTENT_TYPE,
)
+def get_test_value_summary(request, project):
+ test_ids = utils.get_id_list(request.GET['test_ids'])
+ page_name = request.GET.get("page_name", "")
+ range = request.GET.get("range", 30)
+
+ now = int(time.time())
+
+ begin = now - 2592000
+
+ if range == 60:
+ begin = now - 5184000
+ elif range == 90:
+ begin = now - 7776000
+
+ return HttpResponse(
+ json.dumps(testdata.get_test_value_summary(
+ project,
+ test_ids,
+ page_name,
+ begin,
+ now
+ )),
+ content_type=API_CONTENT_TYPE,
+ )
View
7 datazilla/webapp/apps/summary/b2g_app_urls.py
@@ -0,0 +1,7 @@
+from django.conf.urls.defaults import *
+from datazilla.webapp.apps.summary import summary_view
+
+urlpatterns = patterns('',
+ #UI Application
+ (r'^$', summary_view.apps_summary_page)
+ )
View
8 datazilla/webapp/apps/summary/summary_view.py
@@ -18,3 +18,11 @@ def summary_page(request, project="", branch="", revision=""):
'metrics.summary.html', template_context
)
+def apps_summary_page(request, project="", branch="", revision=""):
+
+ #give template access to the DEBUG variable
+ template_context = { 'DEBUG':settings.DEBUG }
+
+ return render_to_response(
+ 'apps.summary.html', template_context
+ )
View
1 datazilla/webapp/static/css/apps-summary-min.css
@@ -0,0 +1 @@
+.ui-helper-hidden{display:none;}.ui-helper-hidden-accessible{position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none;}.ui-helper-clearfix:after{content:".";display:block;height:0;clear:both;visibility:hidden;}.ui-helper-clearfix{display:inline-block;}/* required comment for clearfix to work in Opera \*/ * html .ui-helper-clearfix{height:1%;}.ui-helper-clearfix{display:block;}/* end clearfix */ .ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0);}.ui-state-disabled{cursor:default!important;}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;}.ui-widget-overlay{position:absolute;top:0;left:0;width:100%;height:100%;}.ui-widget{font-family:Arial,sans-serif;font-size:1.1em;}.ui-widget .ui-widget{font-size:1em;}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,sans-serif;font-size:1em;}.ui-widget-content{border:1px solid #B6B6B6;background:#fff;color:#4F4F4F;}.ui-widget-content a{color:#4F4F4F;}.ui-widget-header{border:1px solid #B6B6B6;color:#4F4F4F;font-weight:bold;}.ui-widget-header{background:url(images/bg_fallback.png) 0 0 repeat-x;background:-webkit-gradient(linear,left bottom,left top,color-stop(1,#ededed),color-stop(0,#c4c4c4));background:-moz-linear-gradient(center top,#ededed,#c4c4c4);}.ui-widget-header a{color:#4F4F4F;}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #B6B6B6;font-weight:normal;color:#4F4F4F;}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{background:url(images/bg_fallback.png) 0 0 repeat-x;background:-webkit-gradient(linear,left bottom,left top,color-stop(1,#ededed),color-stop(0,#c4c4c4));background:-moz-linear-gradient(center top,#ededed,#c4c4c4);-webkit-box-shadow:0 1px 0 rgba(255,255,255,0.6) inset;-moz-box-shadow:0 1px 0 rgba(255,255,255,0.6) inset;box-shadow:0 1px 0 rgba(255,255,255,0.6) inset;}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#4F4F4F;text-decoration:none;}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #9D9D9D;font-weight:normal;color:#313131;}.ui-state-hover a,.ui-state-hover a:hover{color:#313131;text-decoration:none;}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{outline:none;color:#1c4257;border:1px solid #7096ab;background:url(images/bg_fallback.png) 0 -50px repeat-x;background:-webkit-gradient(linear,left bottom,left top,color-stop(1,#b9e0f5),color-stop(0,#92bdd6));background:-moz-linear-gradient(center top,#b9e0f5,#92bdd6);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#313131;text-decoration:none;}.ui-widget :active{outline:none;}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #d2dbf4;background:#f4f8fd;color:#0d2054;-moz-border-radius:0!important;-webkit-border-radius:0!important;border-radius:0!important;}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636;}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #e2d0d0;background:#fcf0f0;color:#280b0b;-moz-border-radius:0!important;-webkit-border-radius:0!important;border-radius:0!important;}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a;}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a;}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold;}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal;}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none;}.ui-icon{width:16px;height:16px;background-image:url(Aristo/images/ui-icons_222222_256x240.png);}.ui-widget-content .ui-icon{background-image:url(Aristo/images/ui-icons_222222_256x240.png);}.ui-widget-header .ui-icon{background-image:url(Aristo/images/ui-icons_222222_256x240.png);}.ui-state-default .ui-icon{background-image:url(Aristo/images/ui-icons_454545_256x240.png);}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(Aristo/images/ui-icons_454545_256x240.png);}.ui-state-active .ui-icon{background-image:url(Aristo/images/ui-icons_454545_256x240.png);}.ui-state-highlight .ui-icon{background-image:url(Aristo/images/ui-icons_454545_256x240.png);}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background:url(Aristo/images/icon_sprite.png) -16px 0 no-repeat!important;}.ui-state-highlight .ui-icon,.ui-state-error .ui-icon{margin-top:-1px;}.ui-icon-carat-1-n{background-position:0 0;}.ui-icon-carat-1-ne{background-position:-16px 0;}.ui-icon-carat-1-e{background-position:-32px 0;}.ui-icon-carat-1-se{background-position:-48px 0;}.ui-icon-carat-1-s{background-position:-64px 0;}.ui-icon-carat-1-sw{background-position:-80px 0;}.ui-icon-carat-1-w{background-position:-96px 0;}.ui-icon-carat-1-nw{background-position:-112px 0;}.ui-icon-carat-2-n-s{background-position:-128px 0;}.ui-icon-carat-2-e-w{background-position:-144px 0;}.ui-icon-triangle-1-n{background-position:0 -16px;}.ui-icon-triangle-1-ne{background-position:-16px -16px;}.ui-icon-triangle-1-e{background-position:-32px -16px;}.ui-icon-triangle-1-se{background-position:-48px -16px;}.ui-icon-triangle-1-s{background-position:-64px -16px;}.ui-icon-triangle-1-sw{background-position:-80px -16px;}.ui-icon-triangle-1-w{background-position:-96px -16px;}.ui-icon-triangle-1-nw{background-position:-112px -16px;}.ui-icon-triangle-2-n-s{background-position:-128px -16px;}.ui-icon-triangle-2-e-w{background-position:-144px -16px;}.ui-icon-arrow-1-n{background-position:0 -32px;}.ui-icon-arrow-1-ne{background-position:-16px -32px;}.ui-icon-arrow-1-e{background-position:-32px -32px;}.ui-icon-arrow-1-se{background-position:-48px -32px;}.ui-icon-arrow-1-s{background-position:-64px -32px;}.ui-icon-arrow-1-sw{background-position:-80px -32px;}.ui-icon-arrow-1-w{background-position:-96px -32px;}.ui-icon-arrow-1-nw{background-position:-112px -32px;}.ui-icon-arrow-2-n-s{background-position:-128px -32px;}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px;}.ui-icon-arrow-2-e-w{background-position:-160px -32px;}.ui-icon-arrow-2-se-nw{background-position:-176px -32px;}.ui-icon-arrowstop-1-n{background-position:-192px -32px;}.ui-icon-arrowstop-1-e{background-position:-208px -32px;}.ui-icon-arrowstop-1-s{background-position:-224px -32px;}.ui-icon-arrowstop-1-w{background-position:-240px -32px;}.ui-icon-arrowthick-1-n{background-position:0 -48px;}.ui-icon-arrowthick-1-ne{background-position:-16px -48px;}.ui-icon-arrowthick-1-e{background-position:-32px -48px;}.ui-icon-arrowthick-1-se{background-position:-48px -48px;}.ui-icon-arrowthick-1-s{background-position:-64px -48px;}.ui-icon-arrowthick-1-sw{background-position:-80px -48px;}.ui-icon-arrowthick-1-w{background-position:-96px -48px;}.ui-icon-arrowthick-1-nw{background-position:-112px -48px;}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px;}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px;}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px;}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px;}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px;}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px;}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px;}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px;}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px;}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px;}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px;}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px;}.ui-icon-arrowreturn-1-w{background-position:-64px -64px;}.ui-icon-arrowreturn-1-n{background-position:-80px -64px;}.ui-icon-arrowreturn-1-e{background-position:-96px -64px;}.ui-icon-arrowreturn-1-s{background-position:-112px -64px;}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px;}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px;}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px;}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px;}.ui-icon-arrow-4{background-position:0 -80px;}.ui-icon-arrow-4-diag{background-position:-16px -80px;}.ui-icon-extlink{background-position:-32px -80px;}.ui-icon-newwin{background-position:-48px -80px;}.ui-icon-refresh{background-position:-64px -80px;}.ui-icon-shuffle{background-position:-80px -80px;}.ui-icon-transfer-e-w{background-position:-96px -80px;}.ui-icon-transferthick-e-w{background-position:-112px -80px;}.ui-icon-folder-collapsed{background-position:0 -96px;}.ui-icon-folder-open{background-position:-16px -96px;}.ui-icon-document{background-position:-32px -96px;}.ui-icon-document-b{background-position:-48px -96px;}.ui-icon-note{background-position:-64px -96px;}.ui-icon-mail-closed{background-position:-80px -96px;}.ui-icon-mail-open{background-position:-96px -96px;}.ui-icon-suitcase{background-position:-112px -96px;}.ui-icon-comment{background-position:-128px -96px;}.ui-icon-person{background-position:-144px -96px;}.ui-icon-print{background-position:-160px -96px;}.ui-icon-trash{background-position:-176px -96px;}.ui-icon-locked{background-position:-192px -96px;}.ui-icon-unlocked{background-position:-208px -96px;}.ui-icon-bookmark{background-position:-224px -96px;}.ui-icon-tag{background-position:-240px -96px;}.ui-icon-home{background-position:0 -112px;}.ui-icon-flag{background-position:-16px -112px;}.ui-icon-calendar{background-position:-32px -112px;}.ui-icon-cart{background-position:-48px -112px;}.ui-icon-pencil{background-position:-64px -112px;}.ui-icon-clock{background-position:-80px -112px;}.ui-icon-disk{background-position:-96px -112px;}.ui-icon-calculator{background-position:-112px -112px;}.ui-icon-zoomin{background-position:-128px -112px;}.ui-icon-zoomout{background-position:-144px -112px;}.ui-icon-search{background-position:-160px -112px;}.ui-icon-wrench{background-position:-176px -112px;}.ui-icon-gear{background-position:-192px -112px;}.ui-icon-heart{background-position:-208px -112px;}.ui-icon-star{background-position:-224px -112px;}.ui-icon-link{background-position:-240px -112px;}.ui-icon-cancel{background-position:0 -128px;}.ui-icon-plus{background-position:-16px -128px;}.ui-icon-plusthick{background-position:-32px -128px;}.ui-icon-minus{background-position:-48px -128px;}.ui-icon-minusthick{background-position:-64px -128px;}.ui-icon-close{background-position:-80px -128px;}.ui-icon-closethick{background-position:-96px -128px;}.ui-icon-key{background-position:-112px -128px;}.ui-icon-lightbulb{background-position:-128px -128px;}.ui-icon-scissors{background-position:-144px -128px;}.ui-icon-clipboard{background-position:-160px -128px;}.ui-icon-copy{background-position:-176px -128px;}.ui-icon-contact{background-position:-192px -128px;}.ui-icon-image{background-position:-208px -128px;}.ui-icon-video{background-position:-224px -128px;}.ui-icon-script{background-position:-240px -128px;}.ui-icon-alert{background-position:0 -144px;}.ui-icon-info{background:url(Aristo/images/icon_sprite.png) 0 0 no-repeat!important;}.ui-icon-notice{background-position:-32px -144px;}.ui-icon-help{background-position:-48px -144px;}.ui-icon-check{background-position:-64px -144px;}.ui-icon-bullet{background-position:-80px -144px;}.ui-icon-radio-off{background-position:-96px -144px;}.ui-icon-radio-on{background-position:-112px -144px;}.ui-icon-pin-w{background-position:-128px -144px;}.ui-icon-pin-s{background-position:-144px -144px;}.ui-icon-play{background-position:0 -160px;}.ui-icon-pause{background-position:-16px -160px;}.ui-icon-seek-next{background-position:-32px -160px;}.ui-icon-seek-prev{background-position:-48px -160px;}.ui-icon-seek-end{background-position:-64px -160px;}.ui-icon-seek-start{background-position:-80px -160px;}.ui-icon-seek-first{background-position:-80px -160px;}.ui-icon-stop{background-position:-96px -160px;}.ui-icon-eject{background-position:-112px -160px;}.ui-icon-volume-off{background-position:-128px -160px;}.ui-icon-volume-on{background-position:-144px -160px;}.ui-icon-power{background-position:0 -176px;}.ui-icon-signal-diag{background-position:-16px -176px;}.ui-icon-signal{background-position:-32px -176px;}.ui-icon-battery-0{background-position:-48px -176px;}.ui-icon-battery-1{background-position:-64px -176px;}.ui-icon-battery-2{background-position:-80px -176px;}.ui-icon-battery-3{background-position:-96px -176px;}.ui-icon-circle-plus{background-position:0 -192px;}.ui-icon-circle-minus{background-position:-16px -192px;}.ui-icon-circle-close{background-position:-32px -192px;}.ui-icon-circle-triangle-e{background-position:-48px -192px;}.ui-icon-circle-triangle-s{background-position:-64px -192px;}.ui-icon-circle-triangle-w{background-position:-80px -192px;}.ui-icon-circle-triangle-n{background-position:-96px -192px;}.ui-icon-circle-arrow-e{background-position:-112px -192px;}.ui-icon-circle-arrow-s{background-position:-128px -192px;}.ui-icon-circle-arrow-w{background-position:-144px -192px;}.ui-icon-circle-arrow-n{background-position:-160px -192px;}.ui-icon-circle-zoomin{background-position:-176px -192px;}.ui-icon-circle-zoomout{background-position:-192px -192px;}.ui-icon-circle-check{background-position:-208px -192px;}.ui-icon-circlesmall-plus{background-position:0 -208px;}.ui-icon-circlesmall-minus{background-position:-16px -208px;}.ui-icon-circlesmall-close{background-position:-32px -208px;}.ui-icon-squaresmall-plus{background-position:-48px -208px;}.ui-icon-squaresmall-minus{background-position:-64px -208px;}.ui-icon-squaresmall-close{background-position:-80px -208px;}.ui-icon-grip-dotted-vertical{background-position:0 -224px;}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px;}.ui-icon-grip-solid-vertical{background-position:-32px -224px;}.ui-icon-grip-solid-horizontal{background-position:-48px -224px;}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px;}.ui-icon-grip-diagonal-se{background-position:-80px -224px;}.ui-corner-tl{-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;}.ui-corner-tr{-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;}.ui-corner-bl{-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;}.ui-corner-br{-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;}.ui-corner-top{-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;}.ui-corner-bottom{-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;}.ui-corner-right{-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;}.ui-corner-left{-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;}.ui-corner-all{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.ui-widget-overlay{background:#262b33;opacity:.70;filter:Alpha(Opacity=70);}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#000;opacity:.30;filter:Alpha(Opacity=30);-moz-border-radius:8px;-webkit-border-radius:8px;border-radius:8px;}.ui-resizable{position:relative;}.ui-resizable-handle{position:absolute;font-size:.1px;z-index:99999;display:block;}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none;}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0;}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0;}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%;}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%;}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px;}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px;}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px;}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px;}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black;}.ui-accordion{width:100%;}.ui-accordion .ui-accordion-header{cursor:pointer;position:relative;margin-top:1px;zoom:1;}.ui-accordion .ui-accordion-header,.ui-accordion .ui-accordion-content{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;}.ui-accordion .ui-accordion-li-fix{display:inline;}.ui-accordion .ui-accordion-header-active{border-bottom:0!important;}.ui-accordion .ui-accordion-header a{display:block;font-size:12px;font-weight:bold;padding:.5em .5em .5em .7em;}.ui-accordion-icons .ui-accordion-header a{padding-left:2.2em;}.ui-accordion .ui-accordion-header .ui-icon{position:absolute;left:.5em;top:50%;margin-top:-8px;}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;margin-top:-2px;position:relative;top:1px;margin-bottom:2px;overflow:auto;display:none;zoom:1;}.ui-accordion .ui-accordion-content-active{display:block;}.ui-autocomplete{position:absolute;cursor:default;z-index:3!important;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;-moz-box-shadow:0 1px 5px rgba(0,0,0,0.3);-webkit-box-shadow:0 1px 5px rgba(0,0,0,0.3);}* html .ui-autocomplete{width:1px;}.ui-menu{list-style:none;padding:2px;margin:0;display:block;float:left;}.ui-menu .ui-menu{margin-top:-3px;}.ui-menu .ui-menu-item{margin:0;padding:0;zoom:1;float:left;clear:left;width:100%;}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:.2em .4em;line-height:1.5;zoom:1;}.ui-menu .ui-menu-item a.ui-state-hover,.ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px;background:#5f83b9;color:#FFF;text-shadow:0 1px 1px #234386;border-color:#466086;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;}.ui-button{display:inline-block;position:relative;padding:0;margin-right:.1em;text-decoration:none!important;cursor:pointer;text-align:center;zoom:1;overflow:visible;-webkit-user-select:none;-moz-user-select:none;user-select:none;}.ui-button-icon-only{width:2.2em;}button.ui-button-icon-only{width:2.4em;}.ui-button-icons-only{width:3.4em;}button.ui-button-icons-only{width:3.7em;}.ui-button{-webkit-transition:-webkit-box-shadow .25s ease-in-out;-moz-transition:-moz-box-shadow .25s ease-in-out;-o-transition:-o-box-shadow .25s ease-in-out;}.ui-button.ui-state-hover{-moz-box-shadow:0 0 8px rgba(0,0,0,0.15),0 1px 0 rgba(255,255,255,0.8) inset;-webkit-box-shadow:0 0 8px rgba(0,0,0,0.15),0 1px 0 rgba(255,255,255,0.8) inset;box-shadow:0 0 8px rgba(0,0,0,0.15),0 1px 0 rgba(255,255,255,0.8) inset;}.ui-button.ui-state-focus{outline:none;color:#1c4257;border-color:#7096ab;background:url(images/bg_fallback.png) 0 -50px repeat-x;background:-webkit-gradient(linear,left bottom,left top,color-stop(1,#b9e0f5),color-stop(0,#92bdd6));background:-moz-linear-gradient(center top,#b9e0f5,#92bdd6);-moz-box-shadow:0 0 8px rgba(0,0,0,0.15),0 1px 0 rgba(255,255,255,0.8) inset;-webkit-box-shadow:0 0 8px rgba(0,0,0,0.15),0 1px 0 rgba(255,255,255,0.8) inset;box-shadow:0 0 8px rgba(0,0,0,0.15),0 1px 0 rgba(255,255,255,0.8) inset;}.ui-button .ui-button-text{display:block;line-height:1.4;font-size:14px;font-weight:bold;text-shadow:0 1px 0 rgba(255,255,255,0.6);}.ui-button-text-only .ui-button-text{padding:.4em 1em;}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px;}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em;}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em;}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em;}input.ui-button{font-size:14px;font-weight:bold;text-shadow:0 1px 0 rgba(255,255,255,0.6);padding:0 1em!important;height:33px;}input.ui-button::-moz-focus-inner{border:0;padding:0;}@media screen and(-webkit-min-device-pixel-ratio:0){input.ui-button{height:31px!important;}}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px;}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px;}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em;}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em;}.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em;}.ui-buttonset{margin-right:7px;}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em;}.ui-buttonset .ui-button.ui-state-active{color:#1c4257;border-color:#7096ab;}.ui-buttonset .ui-button.ui-state-active{background-image:-webkit-gradient(linear,left bottom,left top,color-stop(1,#b9e0f5),color-stop(0,#92bdd6));background-image:-moz-linear-gradient(center top,#b9e0f5,#92bdd6);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}button.ui-button::-moz-focus-inner{border:0;padding:0;}.ui-dialog{position:absolute;padding:0;width:300px;overflow:hidden;}.ui-dialog{-webkit-box-shadow:0 2px 12px rgba(0,0,0,0.6);-moz-box-shadow:0 2px 12px rgba(0,0,0,0.6);}.ui-dialog .ui-dialog-titlebar{padding:.7em 1em .6em 1em;position:relative;border:none;border-bottom:1px solid #979797;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;}.ui-dialog .ui-dialog-title{float:left;margin:.1em 16px .2em 0;font-size:14px;text-shadow:0 1px 0 rgba(255,255,255,0.5);}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.8em;top:55%;width:16px;margin:-10px 0 0 0;padding:0;height:16px;}.ui-dialog .ui-dialog-titlebar-close span{display:block;margin:1px;background:url(Aristo/images/icon_sprite.png) 0 -16px no-repeat;}.ui-dialog .ui-dialog-titlebar-close:hover span{background-position:-16px -16px;}.ui-dialog .ui-dialog-titlebar-close:hover,.ui-dialog .ui-dialog-titlebar-close:focus{padding:0;border:0;}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto;zoom:1;}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin:.5em 0 0 0;padding:.3em 1em .5em .4em;}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right;}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer;}.ui-dialog .ui-resizable-se{width:14px;height:14px;right:3px;bottom:3px;}.ui-draggable .ui-dialog-titlebar{cursor:move;}.ui-slider{position:relative;text-align:left;background:#d7d7d7;}.ui-slider{-moz-box-shadow:0 1px 2px rgba(0,0,0,0.5) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.5) inset;box-shadow:0 1px 2px rgba(0,0,0,0.5) inset;}.ui-slider .ui-slider-handle{background:url(images/slider_handles.png) 0 -23px no-repeat;position:absolute;z-index:2;width:23px;height:23px;cursor:default;border:none;outline:none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;}.ui-slider .ui-state-hover,.ui-slider .ui-state-active{background-position:0 0;}.ui-slider .ui-slider-range{background:#a3cae0;position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0;}.ui-slider .ui-slider-range{-moz-box-shadow:0 1px 2px rgba(17,35,45,0.6) inset;-webkit-box-shadow:0 1px 2px rgba(17,35,45,0.6) inset;box-shadow:0 1px 2px rgba(17,35,45,0.6) inset;}.ui-slider-horizontal{height:5px;}.ui-slider-horizontal .ui-slider-handle{top:-8px;margin-left:-13px;}.ui-slider-horizontal .ui-slider-range{top:0;height:100%;}.ui-slider-horizontal .ui-slider-range-min{left:0;}.ui-slider-horizontal .ui-slider-range-max{right:0;}.ui-slider-vertical{width:5px;height:100px;}.ui-slider-vertical .ui-slider-handle{left:-8px;margin-left:0;margin-bottom:-13px;}.ui-slider-vertical .ui-slider-range{left:0;width:100%;}.ui-slider-vertical .ui-slider-range-min{bottom:0;}.ui-slider-vertical .ui-slider-range-max{top:0;}.ui-tabs{position:relative;zoom:1;border:0;}.ui-tabs .ui-tabs-nav{margin:0;padding:0;background:transparent;border-width:0 0 1px 0;}.ui-tabs .ui-tabs-nav{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:1px;margin:0 .2em 1px 0;border-bottom:0!important;padding:0;white-space:nowrap;}.ui-tabs .ui-tabs-nav li a{float:left;padding:.5em 1em;text-decoration:none;font-size:12px;font-weight:bold;text-shadow:0 1px 0 rgba(255,255,255,0.5);}.ui-tabs .ui-tabs-nav li.ui-tabs-selected{margin-bottom:0;padding-bottom:1px;background:#fff;border-color:#B6B6B6;}.ui-tabs .ui-tabs-nav li.ui-tabs-selected a,.ui-tabs .ui-tabs-nav li.ui-state-disabled a,.ui-tabs .ui-tabs-nav li.ui-state-processing a{cursor:text;outline:none;}.ui-tabs .ui-tabs-nav li a,.ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a{cursor:pointer;}.ui-tabs .ui-tabs-panel{display:block;border-width:0 1px 1px 1px;padding:1em 1.4em;background:none;}.ui-tabs .ui-tabs-panel{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;}.ui-tabs .ui-tabs-hide{display:none!important;}.ui-datepicker{width:17em;padding:0;display:none;border-color:#DDD;}.ui-datepicker{-moz-box-shadow:0 4px 8px rgba(0,0,0,0.5);-webkit-box-shadow:0 4px 8px rgba(0,0,0,0.5);box-shadow:0 4px 8px rgba(0,0,0,0.5);}.ui-datepicker .ui-datepicker-header{position:relative;padding:.35em 0;border:none;border-bottom:1px solid #B6B6B6;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:6px;width:1.8em;height:1.8em;}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{border:1px none;}.ui-datepicker .ui-datepicker-prev{left:2px;}.ui-datepicker .ui-datepicker-next{right:2px;}.ui-datepicker .ui-datepicker-prev span{background-position:0 -32px!important;}.ui-datepicker .ui-datepicker-next span{background-position:-16px -32px!important;}.ui-datepicker .ui-datepicker-prev-hover span{background-position:0 -48px!important;}.ui-datepicker .ui-datepicker-next-hover span{background-position:-16px -48px!important;}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px;background:url(Aristo/images/icon_sprite.png) no-repeat;}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center;font-size:12px;text-shadow:0 1px 0 rgba(255,255,255,0.6);}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0;}.ui-datepicker select.ui-datepicker-month-year{width:100%;}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%;}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em;}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0;}.ui-datepicker td{border:0;padding:1px;}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none;}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0;}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible;}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left;}.ui-datepicker .ui-state-default{background:transparent;border-color:#FFF;}.ui-datepicker .ui-state-active{background:#5F83B9;border-color:#5F83B9;color:#FFF;font-weight:bold;text-shadow:0 1px 1px #234386;}.ui-datepicker.ui-datepicker-multi{width:auto;}.ui-datepicker-multi .ui-datepicker-group{float:left;}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em;}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%;}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%;}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%;}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header{border-left-width:0;}.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0;}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left;}.ui-datepicker-row-break{clear:both;width:100%;}.ui-datepicker-rtl{direction:rtl;}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto;}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto;}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto;}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto;}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right;}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left;}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current{float:right;}.ui-datepicker-rtl .ui-datepicker-group{float:right;}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header{border-right-width:0;border-left-width:1px;}.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px;}.ui-datepicker-cover{display:none;display:block;position:absolute;z-index:-1;filter:mask();top:-4px;left:-4px;width:200px;height:200px;}.ui-progressbar{height:12px;text-align:left;background:#FFF url(images/progress_bar.gif) 0 -14px repeat-x;}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%;background:url(images/progress_bar.gif) 0 0 repeat-x;}.ui-form textarea,.ui-form input:not([type="submit"]):not([type="button"]):not([type="checkbox"]):not([type="radio"]):not([type="file"]){padding:3px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;border:1px solid #cecece;outline:none;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1) inset,0 1px 0 rgba(255,255,255,0.2);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1) inset,0 1px 0 rgba(255,255,255,0.2);box-shadow:0 1px 3px rgba(0,0,0,0.1) inset,0 1px 0 rgba(255,255,255,0.2);-webkit-transition:all .25s ease-in-out;-moz-transition:all .25 ease-in-out;-o-transition:all .25s ease-in-out;}.ui-form textarea:hover,.ui-form input:not([type="submit"]):not([type="button"]):not([type="checkbox"]):not([type="radio"]):not([type="file"]):hover{border:1px solid #bdbdbd;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.2) inset,0 1px 0 rgba(255,255,255,0.2);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.2) inset,0 1px 0 rgba(255,255,255,0.2);box-shadow:0 1px 3px rgba(0,0,0,0.2) inset,0 1px 0 rgba(255,255,255,0.2);}.ui-form textarea:focus,.ui-form input:not([type="submit"]):not([type="button"]):not([type="checkbox"]):not([type="radio"]):not([type="file"]):focus{border:1px solid #95bdd4;-webkit-box-shadow:0 2px 3px rgba(161,202,226,0.5) inset,0 1px 0 rgba(255,255,255,0.2);-moz-box-shadow:0 2px 3px rgba(161,202,226,0.5) inset,0 1px 0 rgba(255,255,255,0.2);box-shadow:0 2px 3px rgba(161,202,226,0.5) inset,0 1px 0 rgba(255,255,255,0.2);}body{font-family:helvetica,arial,sans-serif;margin:0;font-size:10px;padding:0;border-top:2px solid #676767;min-width:1065px;}div.su-title{background:url("/static/images/title.png") no-repeat scroll 0 center transparent;position:absolute;left:15px;width:400px;height:100%;top:0;z-index:1;}a{text-decoration:underline;font-weight:bold;}div.su-large-text{font-size:14px;}.su-light-text{opacity:.8;filter:alpha(opacity=80);}.su-light-text2{opacity:.5;filter:alpha(opacity=50);}div.su-toolbar-base{position:relative;margin-left:auto;margin-right:auto;background:transparent #2a2a2a;background:transparent rgba(38,38,38,0.98);}div.su-vis-detail-panel{margin-top:5px;padding:.5em;overflow:auto;}div.su-toppanel{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;border:0 solid #000;background:-moz-linear-gradient(-90deg,#74D435,#43AA00);background:-webkit-gradient(linear,left top,left bottom,from(#74D435),to(#43AA00));height:50px;width:95%;margin-top:20px;padding-top:10px;}div.su-panel-base{width:95%;background:white;margin-left:auto;margin-right:auto;margin-top:10px;}div.su-main-gauge{float:left;width:350px;margin-left:10px;margin-right:10px;}div.su-reference-info{margin-left:60px;margin-right:20px;}div.su-main-gauge-no-data{width:350px;margin-top:30px;margin-left:320px;}div.su-dashboard-panel{float:left;margin-top:40px;margin-left:10px;}div.su-spinner{background:transparent url(/static/images/spinner.gif) no-repeat center center;height:300px;}div.su-small-spinner{background:transparent url(/static/images/spinner.gif) no-repeat center center;height:35px;width:35px;}.su-scroll-panel{overflow-y:auto;height:200px;width:300px;}.su-no-data{font-size:18px!important;text-align:center;margin-top:130px;opacity:.8;}div.su-progressbar-container{width:275px;}div.su-progressbar-title{width:150px;float:left;margin-right:10px;margin-bottom:5px;}div.su-progressbar{width:70px;float:left;margin-left:10px;margin-bottom:5px;background:#F70;color:#4A0;}div.su-progressbar-value{float:right;margin-bottom:5;margin-left:5;}.su-pass-color{color:#4A0;}.su-fail-color{color:#F70;}table.display tr.su-pass-background-color td{background-color:#8ED460;opacity:.8;}table.display tr.su-fail-background-color td{background-color:#FF9A40;opacity:.8;}div.su-column-headers{float:left;margin-left:150px;margin-top:60px;}div.su-row-headers{float:left;width:125px;text-align:right;margin-right:10px;margin-top:10px;}div.su-grid-values{float:left;margin-top:0;margin-bottom:0;text-align:center;border-top:thin solid;border-left:thin solid;}div.su-grid-column{-webkit-transform:rotate(320deg);-moz-transform:rotate(320deg);-o-transform:rotate(320deg);white-space:nowrap;text-align:center;float:left;width:30px;height:15px;margin-bottom:10px;}div.su-grid-row{float:left;height:30px;width:125px;}div.su-grid-value{float:left;width:30px;height:30px;border-bottom:thin solid;border-right:thin solid;}.dataTables_info{width:100%;}.su-guidearrow-box{position:relative;background:#fff;border:3px solid #e8e8e8;height:30px;}.su-guidearrow-box:after,.su-guidearrow-box:before{left:100%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;}.su-guidearrow-box:after{border-color:rgba(255,255,255,0);border-left-color:#fff;border-width:20px;top:50%;margin-top:-20px;}.su-guidearrow-box:before{border-color:rgba(232,232,232,0);border-left-color:#e8e8e8;border-width:24px;top:50%;margin-top:-24px;}.arrow_box{position:relative;background:#fff;border:3px solid #e8e8e8;}.arrow_box:after,.arrow_box:before{top:100%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;}.arrow_box:after{border-color:rgba(255,255,255,0);border-top-color:#fff;border-width:20px;left:50%;margin-left:-20px;}.arrow_box:before{border-color:rgba(232,232,232,0);border-top-color:#e8e8e8;border-width:24px;left:50%;margin-left:-24px;}.arrow_box_up{position:relative;background:#fff;border:3px solid #e8e8e8;}.arrow_box_up:after,.arrow_box_up:before{bottom:100%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;}.arrow_box_up:after{border-color:rgba(255,255,255,0);border-bottom-color:#fff;border-width:20px;left:50%;margin-left:-20px;}.arrow_box_up:before{border-color:rgba(232,232,232,0);border-bottom-color:#e8e8e8;border-width:24px;left:50%;margin-left:-24px;}div.su-data-series-panel{margin-top:5px;padding:.5em;overflow:auto;}div.su-datum-info-panel{margin-top:5px;margin-left:5px;padding:.5em;float:right;width:190px;}.su-datum-value{text-align:right;float:right;}div.su-datum-desc-value{text-align:right;margin-top:5px;margin-bottom:15px;}.ui-button-text{font-size:11px!important;}.su-vertical-text{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-o-transform:rotate(270deg);white-space:nowrap;position:absolute;left:135px;margin-top:160px;}div.su-wordwrap{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word;}hr.su-light-horz-line{background-color:#0D2054;}.css-right{float:right;}.css-left{float:left;}body{font-family:helvetica,arial,sans-serif;margin:0;font-size:10px;padding:0;border-top:2px solid #676767;min-width:1120px;}div.app-toppanel{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;border:0 solid #000;background:-moz-linear-gradient(-90deg,#5CB2CB,#297E96);background:-webkit-gradient(linear,left top,left bottom,from(#5CB2CB),to(#297E96));height:50px;width:1120px;margin-top:20px;padding-top:10px;}div.app-title{background:url("/static/images/title.png") no-repeat scroll 0 center transparent;position:absolute;left:15px;width:400px;height:100%;top:0;z-index:1;}a{text-decoration:underline;font-weight:bold;}div.app-container{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;border:0 solid #000;width:1120px;padding-top:10px;position:relative;margin-left:auto;margin-right:auto;background:white;}div.app-list-controls{position:absolute;width:150px;height:25px;background:white;}div.app-list-controls-two{position:absolute;width:150px;height:25px;background:white;top:495px;}div.app-list{position:absolute;width:150px;height:420px;top:35px;background:white;overflow:auto;}div.app-list-two{position:absolute;width:150px;height:380px;top:520px;background:white;overflow:auto;}div.app-control-container{position:absolute;width:958px;height:25px;background:white;left:160px;}div.app-control-container-two{position:absolute;width:958px;height:25px;background:white;left:160px;top:495px;}div.app-control-element{padding:5px;float:left;}div.app-control-small-element{margin-top:2px;}div.app-graph-container{position:absolute;width:958px;height:420px;background:white;top:35px;left:160px;}div.app-graph-container-two{position:absolute;width:958px;height:380px;background:white;left:160px;top:520px;}div.app-hints{position:absolute;top:470px;}div.app-detail-graph-container{position:absolute;width:905px;height:25px;background:white;left:30px;top:385px;display:inline;}span.app-data{margin-left:3px;}div.app-build-data{width:100%;float:left;}div.app-spinner{background:transparent url(/static/images/spinner.gif) no-repeat center center;height:420px;}
View
136 datazilla/webapp/static/css/apps.css
@@ -0,0 +1,136 @@
+body {
+ font-family: helvetica, arial, sans-serif;
+ margin: 0;
+ font-size: 10px;
+ padding: 0;
+ border-top: 2px solid #676767;
+ min-width: 1120px;
+}
+div.app-toppanel {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ border: 0 solid #000;
+ background: -moz-linear-gradient(-90deg, #5CB2CB, #297E96);
+ background: -webkit-gradient(linear, left top, left bottom, from(#5CB2CB), to(#297E96));
+ height: 50px;
+ width: 1120px;
+ margin-top: 20px;
+ padding-top: 10px;
+}
+div.app-title {
+ background: url("/static/images/title.png") no-repeat scroll 0 center transparent;
+ position: absolute;
+ left: 15px;
+ width:400px;
+ height:100%;
+ top: 0;
+ z-index: 1;
+}
+a {
+ text-decoration: underline;
+ font-weight: bold;
+}
+
+div.app-container {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ border: 0 solid #000;
+ width: 1120px;
+ padding-top: 10px;
+ position: relative;
+ margin-left: auto;
+ margin-right: auto;
+ background:white;
+}
+div.app-list-controls {
+ position:absolute;
+ width: 150px;
+ height: 25px;
+ background: white;
+}
+div.app-list-controls-two {
+ position:absolute;
+ width: 150px;
+ height: 25px;
+ background: white;
+ top: 495px;
+}
+div.app-list {
+ position:absolute;
+ width: 150px;
+ height: 420px;
+ top:35px;
+ background: white;
+ overflow: auto;
+}
+div.app-list-two {
+ position:absolute;
+ width: 150px;
+ height: 380px;
+ top: 520px;
+ background: white;
+ overflow: auto;
+}
+div.app-control-container {
+ position:absolute;
+ width: 958px;
+ height: 25px;
+ background: white;
+ left: 160px;
+}
+div.app-control-container-two {
+ position:absolute;
+ width: 958px;
+ height: 25px;
+ background: white;
+ left: 160px;
+ top: 495px;
+}
+div.app-control-element {
+ padding: 5px;
+ float: left;
+}
+div.app-control-small-element {
+ margin-top: 2px;
+}
+div.app-graph-container {
+ position:absolute;
+ width: 958px;
+ height: 420px;
+ background: white;
+ top:35px;
+ left: 160px;
+}
+div.app-graph-container-two {
+ position:absolute;
+ width: 958px;
+ height: 380px;
+ background: white;
+ left: 160px;
+ top:520px;
+}
+div.app-hints {
+ position:absolute;
+ top: 470px;
+}
+div.app-detail-graph-container {
+ position:absolute;
+ width: 905px;
+ height: 25px;
+ background: white;
+ left: 30px;
+ top: 385px;
+
+ display:inline;
+}
+span.app-data {
+ margin-left:3px;
+}
+div.app-build-data{
+ width:100%;
+ float:left;
+}
+div.app-spinner {
+ background: transparent url(/static/images/spinner.gif) no-repeat center center;
+ height:420px;
+}
View
45 datazilla/webapp/static/js/b2g_apps/AppsPage.js
@@ -0,0 +1,45 @@
+/*******
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/.
+ * *****/
+
+APPS_PAGE = {};
+
+var AppsPage = new Class( {
+
+ Extends: Page,
+
+ jQuery:'AppsPage',
+
+ initialize: function(selector, options){
+
+ this.parent(options);
+ this.revisionLength = 16;
+
+ },
+
+ setRefData: function(){
+
+ APPS_PAGE.refData = {};
+
+ APPS_PAGE.refData.project = 'b2g';
+
+ },
+ getRevisionSlice: function(revision){
+ return revision.slice(0, this.revisionLength);
+ }
+
+});
+
+$(document).ready(function() {
+
+ APPS_PAGE = new AppsPage();
+
+ APPS_PAGE.setRefData();
+
+ APPS_PAGE.graphControlsComponent = new GraphControlsComponent();
+ APPS_PAGE.performanceGraphComponent = new PerformanceGraphComponent();
+ APPS_PAGE.replicateGaphComponent = new ReplicateGraphComponent();
+
+});
View
303 datazilla/webapp/static/js/b2g_apps/GraphControlsComponent.js
@@ -0,0 +1,303 @@
+/*******
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/.
+ * *****/
+var GraphControlsComponent = new Class({
+
+ Extends: Component,
+
+ jQuery:'GraphControlsComponent',
+
+ initialize: function(selector, options){
+
+ this.setOptions(options);
+
+ this.parent(options);
+
+ this.view = new GraphControlsView();
+ this.model = new GraphControlsModel();
+
+ this.appLookup = {};
+ this.testLookup = {};
+
+ this.model.getApps(this, this.initializeAppList);
+
+ this.appToggleEvent = 'APP_TOGGLE_EV';
+ this.testToggleEvent = 'TEST_TOGGLE_EV';
+
+ this.excludeList = {
+ 'b2g_gaia_launch_perf': true,
+ 'gallery_load_end': true,
+ 'camera_load_end': true,
+ 'phone_time_to_paint': true,
+ 'music_time_to_paint': true,
+ 'music_load_end': true,
+ 'messages_load_end': true,
+ 'messages_time_to_paint': true,
+ 'phone_load_end': true,
+ 'camera_time_to_paint': true,
+ 'settings_load_end': true,
+ 'gallery_time_to_paint': true,
+ 'settings_time_to_paint': true,
+ };
+ },
+ initializeAppList: function(data){
+
+ var sortOrder = this.view.getAlphabeticalSortKeys(data);
+
+ var colorIndex = 0;
+ var colorCount = this.view.colors.length - 1;
+ var hexColor = "";
+
+ for(var i=0; i<sortOrder.length; i++){
+
+ var seriesDatum = data[ sortOrder[i] ];
+
+ if( this.excludeList[ seriesDatum.name ] ){
+ continue;
+ }
+
+ if(colorIndex > colorCount){
+ colorIndex = 0;
+ }
+
+ hexColor = this.view.colors[colorIndex];
+ colorIndex++;
+
+ this.view.getSeriesLabel(
+ this.view.datasetLegendSel, hexColor, seriesDatum,
+ this.toggleAppSeries, this, this.view.appSeriesContainerSel,
+ this.view.appSeriesIdPrefix
+ );
+
+ seriesDatum['color'] = hexColor;
+ this.appLookup[ seriesDatum.id ] = seriesDatum;
+ }
+
+ this.model.getTests(this, this.initializeTestList);
+
+ },
+ initializeTestList: function(data){
+
+ var sortOrder = this.view.getAlphabeticalSortKeys(data);
+
+ sortOrder.reverse();
+
+ for(var i=0; i<sortOrder.length; i++){
+
+ var seriesDatum = data[ sortOrder[i] ];
+
+ if( this.excludeList[ seriesDatum.url ] ){
+ continue;
+ }
+
+ this.view.getSeriesLabel(
+ this.view.datasetTestLegendSel, this.view.testColor,
+ seriesDatum, this.toggleTestSeries, this,
+ this.view.testSeriesContainerSel,
+ this.view.testSeriesIdPrefix
+ );
+
+ this.testLookup[ seriesDatum.id ] = seriesDatum;
+ }
+
+ var inputEls = $(this.view.testSeriesContainerSel).find('input');
+ $(inputEls[0]).click();
+ },
+ toggleAppSeries: function(event){
+
+ var idAttr = $(event.currentTarget).parent().parent().attr('id');
+ var id = this.view.getId(idAttr);
+
+ $(this.view.appContainerSel).trigger(
+ this.appToggleEvent,
+ { 'test_id':id }
+ );
+
+ },
+ toggleTestSeries: function(event){
+
+ var idAttr = $(event.currentTarget).parent().parent().attr('id');
+ var id = this.view.getId(idAttr);
+
+ var eventData = this.testLookup[id];
+
+ this.view.selectApplications(eventData.test_ids);
+
+ for( var tId in eventData['test_ids'] ){
+
+ eventData['test_ids'][ tId ] = {
+ 'name':this.appLookup[ tId ]['name'],
+ 'color':this.appLookup[ tId ]['color']
+ };
+ }
+
+ $(this.view.appContainerSel).trigger(
+ this.testToggleEvent, eventData
+ );
+
+ }
+});
+var GraphControlsView = new Class({
+
+ Extends:View,
+
+ jQuery:'GraphControlsView',
+
+ initialize: function(selector, options){
+
+ this.setOptions(options);
+
+ this.parent(options);
+
+ this.appSeriesContainerSel = '#app_series';
+ this.testSeriesContainerSel = '#test_series';
+
+ this.idRegex = /^.*_(\d+)$/;
+
+ this.colors = [
+ '#0b3b40', '#99911c', '#a66247', '#7989b3', '#8bccc4', '#f2eba5', '#ff622e', '#cc8bc7', '#2254bf', '#22bf90', '#666345', '#ffbead', '#481059', '#2c96f2', '#10593d', '#ffc42e', '#4c1a0e', '#a35dd9', '#add9ff', '#196612', '#332409', '#604e73', '#103859', '#3dbf22', '#7f5717', '#462eff', '#1e84a6', '#88b379', '#f2cea5', '#1e1ea6', '#2cdbf2', '#d4f22c', '#e58729', '#091233', '#a61e88', '#ff2ee3',
+ ];
+
+ this.testColor = '#5CB2CB';
+
+ this.appContainerSel = '#app_container';
+
+ //series label ids
+ this.datasetLegendSel = '#su_legend';
+ this.datasetTestLegendSel = '#su_test_legend';
+ this.datasetTitleName = 'su_dataset_title';
+ this.datasetCbContainerName = 'su_dataset_cb';
+ this.datasetCloseName = 'su_dataset_close';
+ this.appSeriesIdPrefix = 'app_series_';
+ this.testSeriesIdPrefix = 'test_series_';
+ },
+ selectApplications: function(testIds){
+
+ var inputEls = $(this.appSeriesContainerSel).find('input');
+ var inputEl = "";
+ var idAttr = "";
+ var id = "";
+ var checked = "";
+
+ for(var i=0; i<inputEls.length; i++){
+
+ inputEl = inputEls[i];
+ idAttr = $(inputEl).parent().parent().attr('id');
+ checked = $(inputEl).attr('checked');
+ id = this.getId(idAttr);
+
+ if(id in testIds){
+ if(!checked){
+ $(inputEl).click();
+ }
+ }else{
+ if(checked){
+ $(inputEl).click();
+ }
+ }
+ }
+ },
+ getSeriesLabel: function(
+ legendIdSel, hexColor, seriesDatum, fnCallback, context,
+ containerSel, idPrefix
+ ){
+
+ var rgbAlpha = this.hexToRgb(hexColor);
+
+ var label = "";
+ if(seriesDatum['url']){
+ label = seriesDatum.url;
+ }else{
+ label = seriesDatum.name;
+ }
+
+ var legendClone = $(legendIdSel).clone();
+ $(legendClone).attr(
+ 'id', idPrefix + seriesDatum.id
+ );
+
+ var inputEl = $(legendClone).find('input');
+ $(inputEl).bind('click', _.bind( fnCallback, context ) );
+
+ var titleDiv = $(legendClone).find(
+ '[name="' + this.datasetTitleName + '"]'
+ );
+
+ $(titleDiv).text( label );
+
+ $(legendClone).css('background-color', rgbAlpha);
+ $(legendClone).css('border-color', hexColor);
+ $(legendClone).css('border-width', 1);
+ $(legendClone).css('display', 'block');
+
+ $(legendClone).hover(
+ function(){
+ //On mouseOver
+ $(this).css('background-color', '#FFFFFF');
+ },
+ function(){
+ //On mouseOut
+ $(this).css('background-color', rgbAlpha);
+ }
+ );
+
+ $(containerSel).append(legendClone);
+
+ },
+ getId: function(idAttr){
+ var id = "";
+ if(idAttr){
+ var idMatch = this.idRegex.exec(idAttr);
+ if(idMatch && idMatch.length === 2){
+ id = idMatch[1];
+ }
+ }
+ return id;
+ }
+});
+var GraphControlsModel = new Class({
+
+ Extends:Model,
+
+ jQuery:'GraphControlsModel',
+
+ initialize: function(options){
+
+ this.setOptions(options);
+
+ this.parent(options);
+
+ },
+
+ getApps: function(context, fnSuccess){
+
+ var uri = '/' + APPS_PAGE.refData.project + '/refdata/perftest/ref_data/tests';
+
+ jQuery.ajax( uri, {
+ accepts:'application/json',
+ dataType:'json',
+ cache:false,
+ type:'GET',
+ data:data,
+ context:context,
+ success:fnSuccess,
+ });
+ },
+
+ getTests: function(context, fnSuccess){
+
+ var uri = '/' + APPS_PAGE.refData.project + '/refdata/perftest/ref_data/pages';
+
+ jQuery.ajax( uri, {
+ accepts:'application/json',
+ dataType:'json',
+ cache:false,
+ type:'GET',
+ data:data,
+ context:context,
+ success:fnSuccess,
+ });
+ }
+});
View
365 datazilla/webapp/static/js/b2g_apps/PerformanceGraphComponent.js
@@ -0,0 +1,365 @@
+/*******
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/.
+ * *****/
+var PerformanceGraphComponent = new Class({
+
+ Extends: Component,
+
+ jQuery:'PerformanceGraphComponent',
+
+ initialize: function(selector, options){
+
+ this.setOptions(options);
+
+ this.parent(options);
+
+ this.view = new PerformanceGraphView();
+ this.model = new PerformanceGraphModel();
+
+ this.appToggleEvent = 'APP_TOGGLE_EV';
+ this.testToggleEvent = 'TEST_TOGGLE_EV';
+ this.perfPlotClickEvent = 'PERF_PLOT_CLICK_EV';
+
+ this.testData = {};
+ this.appData = {}
+ this.chartData = {};
+ this.seriesIndexDataMap = {};
+ this.tickDisplayDates = {};
+ this.checkedApps = {};
+ this.data = {};
+
+ this.replicatesInitialized = false;
+
+ this.chartOptions = {
+ 'grid': {
+ 'clickable': true,
+ 'hoverable': true,
+ 'autoHighlight': true,
+ 'color': '#B6B6B6',
+ 'borderWidth': 0.5
+ },
+
+ 'xaxis': {
+ 'tickFormatter': _.bind(this.formatLabel, this)
+ },
+
+ 'yaxis': {
+ 'autoscaleMargin':0.3
+ },
+
+ 'series': {
+
+ 'points': {
+ 'radius': 2.5
+ }
+ },
+
+ 'selection':{
+ 'mode':'x',
+ 'color':'#BDBDBD'
+ },
+
+ 'hooks': {
+ 'draw':[this.draw]
+ } };
+
+ $(this.view.appContainerSel).bind(
+ this.appToggleEvent, _.bind( this.appToggle, this )
+ );
+
+ $(this.view.appContainerSel).bind(
+ this.testToggleEvent, _.bind( this.testToggle, this )
+ );
+
+ $(this.view.chartContainerSel).bind(
+ 'plotclick', _.bind(this._clickPlot, this)
+ );
+
+ $(this.view.chartContainerSel).bind(
+ 'plothover', _.bind(this._hoverPlot, this)
+ );
+
+ $(this.view.timeRangeSel).bind(
+ 'change', _.bind(this.changeTimeRange, this)
+ );
+ },
+ formatLabel: function(label, series){
+ return this.tickDisplayDates[label] || "";
+ },
+ changeTimeRange: function(event){
+ this.testToggle(event, this.testData);
+ },
+ appToggle: function(event, data){
+
+ if(this.checkedApps[ data['test_id'] ]){
+
+ this.checkedApps[ data['test_id'] ] = false;
+
+ }else{
+
+ this.checkedApps[ data['test_id'] ] = true;
+
+ }
+
+ if(this.data){
+ this.renderPlot(this.data);
+ }
+
+ },
+ testToggle: function(event, data){
+
+ this.testData = data;
+
+ this.view.setGraphTestName(this.testData.url);
+
+ var testIds = _.keys(data.test_ids);
+
+ var range = $(this.view.timeRangeSel).val();
+
+ this.view.hideData();
+
+ this.model.getAppData(
+ this, this.renderPlot, testIds.join(','), data.url, range
+ );
+ },
+ renderPlot: function(data){
+
+ this.data = data;
+
+ this.chartData = {};
+
+ var i = 0;
+
+ var testId = 0;
+ var appColor = "";
+ var appName = "";
+ var timestamp = "";
+ var formattedTime = "";
+
+ for(i = 0; i<data.length; i++){
+
+ testId = data[i]['test_id'];
+
+ appName = this.testData['test_ids'][testId]['name'];
+ appColor = this.testData['test_ids'][testId]['color'];
+
+ if(!this.chartData[ testId ]){
+ this.chartData[ testId ] = {};
+ this.chartData[ testId ][ 'id' ] = testId;
+ this.chartData[ testId ][ 'name' ] = appName;
+ this.chartData[ testId ][ 'color' ] = appColor;
+ this.chartData[ testId ][ 'background_color' ] = this.view.hexToRgb(appColor);
+ this.chartData[ testId ][ 'points' ] = { 'show': true };
+ this.chartData[ testId ][ 'lines' ] = { 'show': true };
+ this.chartData[ testId ][ 'data' ] = [];
+ this.chartData[ testId ][ 'full_data' ] = [];
+ }
+
+ timestamp = data[i]['date_run'];
+
+ if((i > 0) && (i < data.length - 1)){
+ if(!this.tickDisplayDates[ data[i]['test_run_id'] ]){
+ formattedTime = this.view.convertTimestampToDate(timestamp);
+ this.tickDisplayDates[ data[i]['test_run_id'] ] = formattedTime;
+ }
+ }
+
+ if(!data[i]['formatted_date_run']){
+ data[i]['formatted_date_run'] = this.view.convertTimestampToDate(
+ timestamp, true
+ );
+ }
+
+ //Data for flot
+ this.chartData[ testId ][ 'data' ].push(
+ [ data[i]['test_run_id'], data[i]['avg'] ]
+ );
+
+ //Data for presentation
+ this.chartData[ testId ][ 'full_data' ].push(
+ [ data[i] ]
+ );
+ }
+
+ var chart = [];
+ var testIds = _.keys(this.chartData);
+
+ var j = 0;
+ var seriesIndex = 0;
+
+ this.seriesIndexDataMap = {};
+
+ for(j = 0; j<testIds.length; j++){
+
+ if(this.checkedApps && !this.checkedApps[ testIds[j] ]){
+ continue;
+ }
+
+ seriesIndex = chart.push( this.chartData[ testIds[j] ] ) - 1
+ this.seriesIndexDataMap[seriesIndex] = this.chartData[ testIds[j] ];
+ }
+
+ this.view.showData();
+
+ this.plot = $.plot(
+ $(this.view.chartContainerSel),
+ chart,
+ this.chartOptions
+ );
+
+ if(!this.replicatesInitialized && this.seriesIndexDataMap[seriesIndex]){
+ this._clickPlot({}, {}, { 'seriesIndex':seriesIndex, 'dataIndex':0 });
+ this.replicatesInitialized = true;
+ }
+ },
+ _clickPlot: function(event, pos, item){
+ var seriesDatum = this.seriesIndexDataMap[ item.seriesIndex ];
+ var datapointDatum = this.seriesIndexDataMap[ item.seriesIndex ]['full_data'][ item.dataIndex ];
+
+ this.plot.unhighlight();
+ this.plot.highlight(item.seriesIndex, item.dataIndex);
+
+ $(this.view.appContainerSel).trigger(
+ this.perfPlotClickEvent,
+ { 'series':seriesDatum, 'datapoint':datapointDatum[0] }
+ );
+ },
+ _hoverPlot: function(event, pos, item){
+
+ if(_.isEmpty(item)){
+
+ this.view.resetSeriesLabelBackground(this.chartData);
+
+ }else {
+ var seriesDatum = this.seriesIndexDataMap[ item.seriesIndex ];
+ var datapointDatum = this.seriesIndexDataMap[ item.seriesIndex ]['full_data'][ item.dataIndex ];
+ this.view.setDetailContainer(seriesDatum, datapointDatum[0]);
+ this.view.highlightSeriesLabel(seriesDatum);
+ }
+ }
+});
+var PerformanceGraphView = new Class({
+
+ Extends:View,
+
+ jQuery:'PerformanceGraphView',
+
+ initialize: function(selector, options){
+
+ this.setOptions(options);
+
+ this.parent(options);
+
+ this.appContainerSel = '#app_container';
+
+ this.timeRangeSel = '#app_time_range';
+ this.chartContainerSel = '#app_perf_chart';
+ this.appTestName = '#app_test_name';
+ this.graphDetailContainerSel = '#app_perf_detail_container';
+ this.perfDataContainerSel = '#app_perf_data_container';
+ this.perfWaitSel = '#app_perf_wait';
+
+ this.detailIdPrefix = 'app_series_';
+ this.idFields = [
+ 'revision', 'formatted_date_run', 'avg', 'std', 'min', 'max'
+ ];
+ this.appDetailIdSel = '#' + this.detailIdPrefix + 'application';
+
+ this.appSeriesIdPrefix = 'app_series_';
+
+ },
+ showData: function(){
+ $(this.perfWaitSel).css('display', 'none');
+ $(this.perfDataContainerSel).css('display', 'block');
+
+ },
+ hideData: function(){
+ $(this.perfDataContainerSel).css('display', 'none');
+ $(this.perfWaitSel).css('display', 'block');
+ },
+ highlightSeriesLabel: function(seriesDatum){
+ $('#' + this.appSeriesIdPrefix + seriesDatum.id ).css(
+ 'background-color', 'white'
+ );
+ },
+ resetSeriesLabelBackground: function(chartData){
+ var testId = 0;
+ for(testId in chartData){
+ $('#' + this.appSeriesIdPrefix + testId ).css(
+ 'background-color', chartData[ testId ][ 'background_color' ]
+ );
+ }
+ },
+ setGraphTestName: function(name){
+ $(this.appTestName).text(name);
+ },
+ setDetailContainer: function(seriesDatum, datapointDatum){
+
+ $(this.graphDetailContainerSel).css(
+ 'background-color', seriesDatum.background_color
+ );
+ $(this.graphDetailContainerSel).css(
+ 'border-color', seriesDatum.color
+ );
+ $(this.graphDetailContainerSel).css(
+ 'border-width', 1
+ );
+
+ $(this.appDetailIdSel).text( seriesDatum['name'] );
+ var i = 0;
+ var fieldName = "";
+ var idSel = "";
+ var value = "";
+
+ for(i = 0; i<this.idFields.length; i++){
+ fieldName = this.idFields[i];
+ idSel = '#' + this.detailIdPrefix + fieldName;
+
+ value = datapointDatum[fieldName];
+ if(fieldName === 'revision'){
+ value = APPS_PAGE.getRevisionSlice(
+ datapointDatum[fieldName]
+ );
+ $(idSel).attr('title', datapointDatum[fieldName]);
+ }
+
+ $(idSel).text( datapointDatum[fieldName] );
+ }
+ }
+});
+var PerformanceGraphModel = new Class({
+
+ Extends:Model,
+
+ jQuery:'PerformanceGraphModel',
+
+ initialize: function(options){
+
+ this.setOptions(options);
+
+ this.parent(options);
+
+ },
+
+ getAppData: function(context, fnSuccess, testIds, pageName, range){
+
+ var uri = '/' + APPS_PAGE.refData.project + '/testdata/test_values?' +
+ 'test_ids=TEST_IDS&page_name=PAGE_NAME&range=RANGE';
+
+ uri = uri.replace('TEST_IDS', testIds);
+ uri = uri.replace('PAGE_NAME', pageName);
+ uri = uri.replace('RANGE', range);
+
+ jQuery.ajax( uri, {
+ accepts:'application/json',
+ dataType:'json',
+ cache:false,
+ type:'GET',
+ data:data,
+ context:context,
+ success:fnSuccess,
+ });
+ }
+});
View
296 datazilla/webapp/static/js/b2g_apps/ReplicateGraphComponent.js
@@ -0,0 +1,296 @@
+/*******
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/.
+ * *****/
+var ReplicateGraphComponent = new Class({
+
+ Extends: Component,
+
+ jQuery:'ReplicateGraphComponent',
+
+ initialize: function(selector, options){
+
+ this.setOptions(options);
+
+ this.parent(options);
+
+ this.view = new ReplicateGraphView();
+ this.model = new ReplicateGraphModel();
+
+ this.perfPlotClickEvent = 'PERF_PLOT_CLICK_EV';
+
+ this.series = {};
+ this.datapoint = {};
+ this.chartData = {};
+
+ this.chartOptions = {
+ 'grid': {
+ 'clickable': true,
+ 'hoverable': true,
+ 'autoHighlight': true,
+ 'color': '#B6B6B6',
+ 'borderWidth': 0.5
+ },
+
+ 'xaxis': {
+ },
+
+ 'yaxis': {
+ 'autoscaleMargin':0.3
+ },
+
+ 'series': {
+
+ 'points': {
+ 'radius': 2.5
+ }
+ }
+ };
+
+ $(this.view.appContainerSel).bind(
+ this.perfPlotClickEvent, _.bind( this.getPlotData, this )
+ );
+
+ $(this.view.chartContainerSel).bind(
+ 'plotclick', _.bind(this._clickPlot, this)
+ );
+
+ $(this.view.chartContainerSel).bind(
+ 'plothover', _.bind(this._hoverPlot, this)
+ );
+ },
+ getPlotData: function(event, data){
+
+ this.series = data.series;
+ this.datapoint = data.datapoint;
+
+ this.view.hideData();
+
+ this.model.getReplicateData(
+ this, this.renderPlot, this.datapoint.test_run_id
+ );
+
+ },
+ renderPlot: function(data){
+
+ this.view.setDetailContainer(this.series, this.datapoint, data);
+
+ var results = data['json_blob']['results'][this.datapoint.url];
+
+ this.chartData = {
+ 'color':this.series['color'],
+ 'bars':{ 'show':true },
+ 'data':[]
+ };
+
+ var i=0;
+ for(i=0; i<results.length; i++){
+ this.chartData['data'].push( [ i + 1, results[i] ] );
+ }
+
+ this.view.showData();
+
+ this.plot = $.plot(
+ $(this.view.chartContainerSel),
+ [this.chartData],
+ this.chartOptions
+ );
+
+ this.view.setHoverData(1, results[0]);
+
+ },
+ _clickPlot: function(event, pos, item){
+
+ },
+ _hoverPlot: function(event, pos, item){
+
+ if(!_.isEmpty(item)){
+ var datum = this.chartData['data'][ item.dataIndex ];
+ this.view.setHoverData(datum[0], datum[1]);
+ }
+ }
+});
+var ReplicateGraphView = new Class({
+
+ Extends:View,
+
+ jQuery:'ReplicateGraphView',
+
+ initialize: function(selector, options){
+
+ this.setOptions(options);
+
+ this.parent(options);
+
+ this.appContainerSel = '#app_container';
+ this.chartContainerSel = '#app_replicate_chart';
+ this.buildDataContainerSel = '#app_replicate_build_data';
+ this.replicateWaitSel = '#app_replicate_wait';
+ this.replicateDataContainerSel = '#app_replicate_data_container';
+
+ this.graphDetailClassSel = '.app-replicate-graph-detail';
+
+ this.idPrefix = 'app_replicate_';
+ this.idFields = [
+ 'application', 'test', 'revision', 'gecko_revision',
+ 'avg', 'min', 'max', 'std'
+ ];
+
+ },
+ showData: function(){
+ $(this.replicateWaitSel).css('display', 'none');
+ $(this.replicateDataContainerSel).css('display', 'block');
+ },
+ hideData: function(){
+ $(this.replicateDataContainerSel).css('display', 'none');
+ $(this.replicateWaitSel).css('display', 'block');
+ },
+ setHoverData: function(x, y){
+ $('#' + this.idPrefix + 'x').text(x);
+ $('#' + this.idPrefix + 'y').text(
+ y.toString().slice(0, 10)
+ );
+ $('#' + this.idPrefix + 'y').attr('title', y);
+ },
+ setDetailContainer: function(seriesDatum, datapointDatum, jsonData){
+
+ $(this.graphDetailClassSel).css(
+ 'background-color', seriesDatum.background_color
+ );
+ $(this.graphDetailClassSel).css(
+ 'border-color', seriesDatum.color
+ );
+ $(this.graphDetailCclassSel).css(
+ 'border-width', 1
+ );
+
+ var i = 0;
+ var field = "";
+ var idAttr = "";
+ var value = "";
+
+ for(i = 0; i<this.idFields.length; i++){
+ field = this.idFields[i];
+ idAttr = '#' + this.idPrefix + field;
+
+ if(field === 'application'){
+ value = seriesDatum.name;
+ }else if(field === 'test'){
+ value = datapointDatum.url;
+ }else if(field === 'revision' || field === 'gecko_revision'){
+
+ value = APPS_PAGE.getRevisionSlice(
+ jsonData['json_blob']['test_build'][field]
+ );
+
+ $(idAttr).attr(
+ 'title', jsonData['json_blob']['test_build'][field]
+ );
+
+ }else if(field === 'date'){
+
+ value = this.convertTimestampToDate(
+ jsonData['json_blob']['testrun'][field], true
+ );
+
+ }else{
+ value = datapointDatum[field];
+ }
+
+ $(idAttr).text(value);
+ }
+
+ $(this.buildDataContainerSel).empty();
+
+ this.loadField(
+ 'date',
+ this.convertTimestampToDate(
+ jsonData['json_blob']['testrun']['date'], true
+ ),
+ this.buildDataContainerSel
+ );
+
+ this.loadField(
+ 'branch',
+ jsonData['json_blob']['test_build']['branch'],
+ this.buildDataContainerSel
+ );
+
+ this.loadField(
+ 'version',
+ jsonData['json_blob']['test_build']['version'],
+ this.buildDataContainerSel
+ );
+
+ this.loadField(
+ 'machine',
+ jsonData['json_blob']['test_machine']['name'],
+ this.buildDataContainerSel
+ );
+
+ this.loadField(
+ 'os',
+ jsonData['json_blob']['test_machine']['os'],
+ this.buildDataContainerSel
+ );
+
+ this.loadField(
+ 'os version',
+ jsonData['json_blob']['test_machine']['osversion'],
+ this.buildDataContainerSel
+ );
+
+ this.loadField(
+ 'platform',
+ jsonData['json_blob']['test_machine']['platform'],
+ this.buildDataContainerSel
+ );
+
+ },
+ loadField: function(fieldName, value, container){
+
+ var divEl = $('<div></div>');
+ $(divEl).addClass('app-control-element app-control-small-element app-build-data');
+ $(divEl).append(fieldName + ':');
+
+ var spanEl = $('<span></span>');
+ $(spanEl).addClass('app-data');
+ $(spanEl).text(value);
+
+ $(divEl).append(spanEl);
+
+ $(container).append(divEl);
+ }
+});
+var ReplicateGraphModel = new Class({
+
+ Extends:Model,
+
+ jQuery:'ReplicateGraphModel',
+
+ initialize: function(options){
+
+ this.setOptions(options);
+
+ this.parent(options);
+
+ },
+
+ getReplicateData: function(context, fnSuccess, testRunId){
+
+ var uri = '/' + APPS_PAGE.refData.project +
+ '/refdata/objectstore/json_blob/test_run/' + testRunId;
+
+ jQuery.ajax( uri, {
+ accepts:'application/json',
+ dataType:'json',
+ cache:false,
+ type:'GET',
+ data:data,
+ context:context,
+ success:fnSuccess,
+ });
+
+ }
+});
View
35 datazilla/webapp/static/js/b2g_apps/apps-summary-min.js
35 additions, 0 deletions not shown because the diff is too large. Please use a local Git client to view these changes.
View
37 datazilla/webapp/static/js/data_views/Bases.js
@@ -123,5 +123,42 @@ var View = new Class({
}
}
return keys.sort();
+ },
+ convertTimestampToDate: function(unixTimestamp, getHMS){
+
+ var dateObj = new Date(unixTimestamp * 1000);
+ var dateString = dateObj.getFullYear() + '-' +
+ this.padNumber((dateObj.getMonth() + 1), 10, '0') + '-' +
+ dateObj.getDate();
+
+ if(getHMS){
+ dateString += ' ' +
+ dateObj.getHours() + ':' +
+ dateObj.getMinutes() + ':' +
+ this.padNumber(dateObj.getSeconds(), 10, '0');
+ }
+
+ return dateString;
+ },
+ padNumber: function(n, max, pad){
+
+ n = parseInt(n);
+
+ if( n < max ){
+ return pad + n;
+ }
+
+ return n;
+ },
+ hexToRgb: function(hex) {
+
+ var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
+
+ //Add alpha channel to lighten the color
+ var rgbAlpha = 'rgba(' + parseInt(result[1], 16) + ',' +
+ parseInt(result[2], 16) + ',' +
+ parseInt(result[3], 16) + ',0.1)';
+
+ return rgbAlpha;
}
});
View
41 datazilla/webapp/static/js/metric_summary/TrendLineComponent.js
@@ -307,7 +307,7 @@ var TrendLineComponent = new Class({
//to keep things unclutered
if((j > 0) && (j <this.trendLines[key]['data'].length - 1)){
var unixTimestamp = this.trendLines[key]['data'][j]['date'];
- tickLabel = this.convertTimestampToDate(
+ tickLabel = this.view.convertTimestampToDate(
unixTimestamp, false
);
}
@@ -505,32 +505,6 @@ var TrendLineComponent = new Class({
'color': this.view.trendLineColor
};
},
- convertTimestampToDate: function(unixTimestamp, getHMS){
-
- var dateObj = new Date(unixTimestamp * 1000);
- var dateString = dateObj.getFullYear() + '-' +
- this.padNumber((dateObj.getMonth() + 1), 10, '0') + '-' +
- dateObj.getDate();
-
- if(getHMS){
- dateString += ' ' +
- dateObj.getHours() + ':' +
- dateObj.getMinutes() + ':' +
- this.padNumber(dateObj.getSeconds(), 10, '0');
- }
-
- return dateString;
- },
- padNumber: function(n, max, pad){
-
- n = parseInt(n);
-
- if( n < max ){
- return pad + n;
- }
-
- return n;
- },
formatLabel: function(label, series){
return this.tickDisplayDates[label] || "";
@@ -778,7 +752,7 @@ var TrendLineComponent = new Class({
keyValueArray.push(
{'label':'date',
- 'value':this.convertTimestampToDate(datum.date, true)});
+ 'value':this.view.convertTimestampToDate(datum.date, true)});
keyValueArray.push(
{'label':'branch',
@@ -1211,17 +1185,6 @@ var TrendLineView = new Class({
$(this).css('background-color', rgbAlpha);
}
},
- hexToRgb: function(hex) {
-
- var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
-
- //Add alpha channel to lighten the color
- var rgbAlpha = 'rgba(' + parseInt(result[1], 16) + ',' +
- parseInt(result[2], 16) + ',' +
- parseInt(result[3], 16) + ',0.1)';
-
- return rgbAlpha;
- },
closeDataSeries: function(key){
$('#' + this.legendIdPrefix + key).remove();
View
142 datazilla/webapp/templates/apps.summary.html
@@ -0,0 +1,142 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+ <title>Perf-o-Matic</title>
+{% if DEBUG %}
+ <link rel="stylesheet" href="/static/css/Aristo/jquery-ui-1.8.7.custom.css" type="text/css"/>
+ <link rel="stylesheet" href="/static/css/summary.css" type="text/css"/>
+ <link rel="stylesheet" href="/static/css/apps.css" type="text/css"/>
+{% else %}
+ <link rel="stylesheet" href="/static/css/apps-summary-min.css" type="text/css"/>
+{% endif %}
+
+</head>
+
+<body>
+
+<!--Toppanel-->
+<div class="ui-widget ui-widget-header ui-corner-top su-toolbar-base app-toppanel">
+ <div class="app-title">
+ <a href=""><span id="logo"></span></a>
+ </div>
+</div>
+
+<div id="su_legend" class="ui-state-highlight ui-corner-all su-data-series-panel" style="display:none;">
+ <div style="margin-bottom:3px;">
+ <input type="checkbox" title="toggle" style="margin-left:2px; margin-right:5px; float:left;" />
+ <div name="su_dataset_title" class="su-wordwrap css-left" style="width:100px; margin-top:4px;"></div>
+ </div>
+</div>
+<div id="su_test_legend" class="ui-state-highlight ui-corner-all su-data-series-panel" style="display:none;">
+ <div style="margin-bottom:3px;">
+ <input type="radio" name="test_type" style="margin-left:2px; margin-right:5px; float:left;" />
+ <div name="su_dataset_title" class="su-wordwrap css-left" style="width:100px; margin-top:4px;"></div>
+ </div>
+</div>
+
+<div id="app_container" class="ui-widget ui-widget-header ui-corner-top app-container">
+ <div id="test_series" class="ui-widget ui-widget-header ui-corner-all app-list-two">
+ </div>
+ <div class="ui-widget ui-widget-header ui-corner-all app-list-controls-two">
+ <div style="padding:5px;" class="su-large-text">Tests</div>
+ </div>
+ <div id="app_series" class="ui-widget ui-widget-header ui-corner-all app-list">
+ </div>
+ <div class="ui-widget ui-widget-header ui-corner-all app-list-controls">
+ <div style="padding:5px;" class="su-large-text">Applications</div>
+ </div>
+ <div class="ui-widget ui-widget-header ui-corner-all app-control-container">
+ <div style="display:inline;">
+ <div style="width:250px;" class="app-control-element su-large-text">Firefox OS Application Performace</div>
+ <div style="width:350px;" class="app-control-element app-control-small-element">Test:<span id="app_test_name" class="app-data"></span></div>
+ <div style="width:150px;" class="app-control-element">Time Range:
+ <select id="app_time_range">
+ <option value="30">30 Days</option>
+ <option value="60">60 Days</option>
+ <option value="90">90 Days</option>
+ </select>
+ </div>
+ </div>
+ </div>
+ <div class="ui-widget ui-widget-header ui-corner-all app-graph-container">
+ <div id="app_perf_wait" class="app-spinner"></div>
+ <div id="app_perf_data_container" style="display:none;">
+ <div style="position:absolute; left:-60px; top:10px;" class="su-vertical-text">Mean Run Time (milliseconds)</div>
+ <div id="app_perf_chart" style="width:905px; height:370px; margin-top:5px; margin-left:35px;"></div>
+ <div id="app_perf_detail_container" class="ui-widget ui-widget-header ui-corner-all app-detail-graph-container">
+ <div style="width:200px;" class="app-control-element app-control-small-element">Application:<span id="app_series_application" class="app-data"></span></div>
+ <div style="width:185px;" class="app-control-element app-control-small-element">Gaia Revision:<span id="app_series_revision" class="app-data"></span></div>
+ <div style="width:140px;" class="app-control-element app-control-small-element">Date:<span id="app_series_formatted_date_run" class="app-data"></span></div>
+ <div style="width:80px;" class="app-control-element app-control-small-element">Mean:<span id="app_series_avg" class="app-data"></span></div>
+ <div style="width:75px;" class="app-control-element app-control-small-element">Min:<span id="app_series_min" class="app-data"></span></div>
+ <div style="width:75px;" class="app-control-element app-control-small-element">Max:<span id="app_series_max" class="app-data"></span></div>
+ <div style="width:75px;" class="app-control-element app-control-small-element">Std:<span id="app_series_std" class="app-data"></span></div>
+ </div>
+ </div>
+ </div>
+ <div class="app-hints su-light-text">Hint: Select a test below to load performance data</div>
+ <div style="left:450px;" class="app-hints su-light-text">Hint: Click on a point above to load the associated replicates below</div>
+ <div class="ui-widget ui-widget-header ui-corner-all app-control-container-two">
+ <div style="display:inline;">
+ <div style="width:120px;" class="app-control-element su-large-text">Test Replicates</div>
+ <div style="width:185px;" class="app-control-element app-control-small-element">Application:<span id="app_replicate_application" class="app-data"></span></div>
+ <div style="width:200px;" class="app-control-element app-control-small-element">Test:<span id="app_replicate_test" class="app-data"></span></div>
+ <div style="width:185px;" class="app-control-element app-control-small-element">Gaia Revision:<span id="app_replicate_revision" class="app-data"></span></div>
+ <div style="width:190px;" class="app-control-element app-control-small-element">Gecko Revision:<span id="app_replicate_gecko_revision" class="app-data"></span></div>
+ </div>
+ </div>
+ <div class="ui-widget ui-widget-header ui-corner-all app-graph-container-two">
+ <div id="app_replicate_wait" style="height:380px;" class="app-spinner"></div>
+ <div id="app_replicate_data_container" style="display:none;">
+ <div style="position:absolute; left:-45px; top:10px;" class="su-vertical-text">Run Time (milliseconds)</div>
+ <div id="app_replicate_chart" style="width:605px; height:340px; margin-top:30px; margin-left:35px;"></div>
+ <div class="ui-widget ui-widget-header ui-corner-all app-detail-graph-container app-replicate-graph-detail" style="width:300px; top:35px; left:648px;">
+ <div style="width:68px;" class="app-control-element app-control-small-element">Mean:<span id="app_replicate_avg" class="app-data"></span></div>
+ <div style="width:68px;" class="app-control-element app-control-small-element">Min:<span id="app_replicate_min" class="app-data"></span></div>
+ <div style="width:68px;" class="app-control-element app-control-small-element">Max:<span id="app_replicate_max" class="app-data"></span></div>
+ <div style="width:50px;" class="app-control-element app-control-small-element">Std:<span id="app_replicate_std" class="app-data"></span></div>
+ </div>
+ <div class="ui-widget ui-widget-header ui-corner-all app-detail-graph-container app-replicate-graph-detail" style="width:300px; top:70px; left:648px;">
+ <div style="width:120px;" class="app-control-element app-control-small-element">Replicate Number:<span id="app_replicate_x" class="app-data"></span></div>
+ <div style="width:150px;" class="app-control-element app-control-small-element">Run Time:<span id="app_replicate_y" class="app-data"></span></div>
+ </div>
+ <div id="app_replicate_build_data" class="ui-widget ui-widget-header ui-corner-all app-detail-graph-container app-replicate-graph-detail" style="width:300px; height:245px; top:105px; left:648px;">
+ </div>
+ </div>
+ </div>
+</div>
+
+{% if DEBUG %}
+<script type="text/javascript" src="/static/js/plugins/jquery-1.6.3.min.js"></script>
+<script type="text/javascript" src="/static/js/plugins/jquery-ui-1.8.13.custom.min.js"></script>
+<script type="text/javascript" src="/static/js/plugins/jquery.url.js"></script>
+<script type="text/javascript" src="/static/js/plugins/flot-0.7/jquery.flot.min.js"></script>
+<script type="text/javascript" src="/static/js/plugins/flot-0.7/jquery.flot.selection.min.js"></script>
+
+<!--[if lte IE 8]><script language="javascript" type="text/javascript" src="/static/js/plugins/flot-0.7/excanvas.min.js"></script><![endif]-->
+
+<script type="text/javascript" src="/static/js/plugins/underscore-min.js"></script>
+<script type="text/javascript" src="/static/js/plugins/box.js"></script>
+
+<!-- Gives core mootools class functionality to jQuery -->
+<script type="text/javascript" src="/static/js/plugins/mootools-core-1.4.0.js"></script>
+<script type="text/javascript" src="/static/js/plugins/moo4q/Source/Class.Mutators.jQuery.js"></script>
+<script type="text/javascript" src="/static/js/plugins/json2.js"></script>
+
+<!-- Metric summary classes -->
+<script type="text/javascript" src="/static/js/data_views/Bases.js"></script>
+<script type="text/javascript" src="/static/js/b2g_apps/AppsPage.js"></script>
+<script type="text/javascript" src="/static/js/b2g_apps/GraphControlsComponent.js"></script>
+<script type="text/javascript" src="/static/js/b2g_apps/PerformanceGraphComponent.js"></script>
+<script type="text/javascript" src="/static/js/b2g_apps/ReplicateGraphComponent.js"></script>
+
+{% else %}
+<script type="text/javascript" src="/static/js/b2g_apps/apps-summary-min.js"></script>
+
+<!--[if lte IE 8]><script language="javascript" type="text/javascript" src="/static/js/plugins/flot-0.7/excanvas.min.js"></script><![endif]-->
+{% endif %}
+
+
+</body>
+</html>
View
17 datazilla/webapp/urls.py
@@ -1,9 +1,12 @@
from django.conf.urls.defaults import patterns, include
from django.http import HttpResponse
+from django.conf import settings
+
# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()
+project_list = settings.ALLOWED_PROJECTS or '\w+'
urlpatterns = patterns('',
# Examples:
@@ -19,20 +22,22 @@
"User-agent: *\nDisallow: /", mimetype="text/plain"
)),
+ (r'^b2g/?', include('datazilla.webapp.apps.summary.b2g_app_urls')),
+
#default UI
- (r'^(?P<project>\w+)/?$', include('datazilla.webapp.apps.dataviews.urls')),
+ (r'^(?P<project>{0})/?$'.format(project_list), include('datazilla.webapp.apps.dataviews.urls')),
#dataview application
- (r'^(?P<project>\w+)/dataviews/?', include('datazilla.webapp.apps.dataviews.urls')),
+ (r'^(?P<project>{0})/dataviews/?'.format(project_list), include('datazilla.webapp.apps.dataviews.urls')),
+
- #revision metrics summary
- (r'^(?P<project>\w+)/summary/?', include('datazilla.webapp.apps.summary.urls')),
+ (r'^(?P<project>{0})/summary/?'.format(project_list), include('datazilla.webapp.apps.summary.urls')),
#datazilla web service
- (r'^(?P<project>\w+)/?', include('datazilla.webapp.apps.datazilla.urls')),
+ (r'^(?P<project>{0})/?'.format(project_list), include('datazilla.webapp.apps.datazilla.urls')),
#api for data ingestion
- (r'^(?P<project>\w+)/api/?', include('datazilla.webapp.apps.datazilla.urls')),
+ (r'^(?P<project>{0})/api/?'.format(project_list), include('datazilla.webapp.apps.datazilla.urls')),
# return reference data about Datazilla, not particular to a project
(r'^refdata/', include("datazilla.webapp.apps.datazilla.refdata.urls_no_project")),

0 comments on commit e122d26

Please sign in to comment.