Percentile graphs
This commit is contained in:
@@ -4,18 +4,9 @@ import sys
|
||||
import time
|
||||
import math
|
||||
import common_lib as mylib
|
||||
import bundle_download
|
||||
import index_app_names
|
||||
|
||||
|
||||
def seconds_to_time(seconds):
|
||||
seconds = int(seconds)
|
||||
minutes, seconds = divmod(seconds, 60)
|
||||
hours, minutes = divmod(minutes, 60)
|
||||
return '{:02d}:{:02d}:{:02d}'.format(hours, minutes, seconds)
|
||||
|
||||
|
||||
def round_num(num):
|
||||
return format(num, '.1f') # .rstrip('0').rstrip('.')
|
||||
import index_meta
|
||||
|
||||
|
||||
def gen_dotgraph(sorted_arr):
|
||||
@@ -59,8 +50,7 @@ def gen_pie_chart(parts, classes, stroke=0.6):
|
||||
|
||||
|
||||
def gen_radial_graph(percent):
|
||||
return '<div class="pie-chart">{}</div>'.format(
|
||||
gen_pie_chart([1 - percent, percent], ['cs0', 'cs1']))
|
||||
return gen_pie_chart([1 - percent, percent], ['cs0', 'cs1'])
|
||||
|
||||
|
||||
def gen_dom_tags(sorted_arr, isSub, onlyTrackers=False):
|
||||
@@ -81,45 +71,82 @@ def gen_dom_tags(sorted_arr, isSub, onlyTrackers=False):
|
||||
|
||||
|
||||
def gen_html(bundle_id, obj):
|
||||
|
||||
def round_num(num):
|
||||
return format(num, '.1f') # .rstrip('0').rstrip('.')
|
||||
|
||||
def as_pm(value):
|
||||
return round_num(value) + '/min'
|
||||
|
||||
def as_percent(value):
|
||||
return round_num(value * 100) + '%'
|
||||
|
||||
def as_date(value):
|
||||
return '<time datetime="{}">{} UTC</time>'.format(
|
||||
time.strftime('%Y-%m-%d %H:%M', time.gmtime(value)),
|
||||
time.strftime('%Y-%m-%d, %H:%M', time.gmtime(value))
|
||||
)
|
||||
|
||||
def seconds_to_time(seconds):
|
||||
seconds = int(seconds)
|
||||
minutes, seconds = divmod(seconds, 60)
|
||||
hours, minutes = divmod(minutes, 60)
|
||||
return '{:02d}:{:02d}:{:02d}'.format(hours, minutes, seconds)
|
||||
|
||||
def stat(col, title, rank, value, optional=None, fmt=str, fmt2=None):
|
||||
# percent = int(rank[0] / max_rank * 100)
|
||||
r = rank[0] / max_rank
|
||||
detail = fmt2(value) if fmt2 else fmt(value)
|
||||
if optional:
|
||||
x = fmt(optional) if fmt2 else optional
|
||||
detail += '<i class="snd mg_lr">({})</i>'.format(x)
|
||||
return f'''
|
||||
<div class="col{col}">
|
||||
<h4>{title}</h4>
|
||||
<div class="percentile {'g' if r < 0.5 else 'b'}"><div style="left: {as_percent(r)}"></div></div>
|
||||
<b class="mg_lr">{detail}</b>
|
||||
<p class="snd">
|
||||
Rank: <b>{rank[0]}</b>,
|
||||
best: <i>{fmt(rank[1])}</i>,
|
||||
worst: <i>{fmt(rank[2])}</i></p>
|
||||
</div>'''
|
||||
|
||||
name = index_app_names.get_name(bundle_id)
|
||||
gernes = bundle_download.get_genres(bundle_id)
|
||||
rank, max_rank = index_meta.get_rank(bundle_id)
|
||||
obj['tracker'] = list(filter(lambda x: x[2], obj['subdom']))
|
||||
return mylib.template_with_base(f'''
|
||||
<h2 class="title">{name}</h2>
|
||||
<p class="subtitle snd"><i class="mg_lr">Bundle-id:</i>{ bundle_id }</p>
|
||||
<div id="meta">
|
||||
<div class="icons">
|
||||
<img src="icon.png" width="100" height="100">
|
||||
{ gen_radial_graph(obj['tracker_percent']) }
|
||||
<img class="app-icon" src="icon.png" alt="app-icon" width="100" height="100">
|
||||
</div>
|
||||
<table>
|
||||
<tr><td>Last update:</td><td><time datetime="{
|
||||
time.strftime('%Y-%m-%d %H:%M', time.gmtime(obj['last_date']))
|
||||
}">{
|
||||
time.strftime('%Y-%m-%d, %H:%M', time.gmtime(obj['last_date']))
|
||||
}</time></td></tr>
|
||||
<tr><td>Number of recordings:</td><td>{ obj['sum_rec'] }</td></tr>
|
||||
<tr><td>Total number of requests:</td><td>{
|
||||
obj['sum_logs'] }<i class="snd mg_lr">({
|
||||
round_num(obj['sum_logs_pm'])} / min)</i></td></tr>
|
||||
<tr><td>Average number of requests:</td><td>{
|
||||
round_num(obj['avg_logs'])}<i class="snd mg_lr">({
|
||||
round_num(obj['avg_logs_pm'])} / min)</i></td></tr>
|
||||
<tr><td>Average recording time:</td><td>{
|
||||
seconds_to_time(obj['avg_time']) }</td></tr>
|
||||
<tr><td>Cumulative recording time:</td><td>{
|
||||
seconds_to_time(obj['sum_time']) }</td></tr>
|
||||
<tr><td>App Categories:</td><td>{
|
||||
', '.join([name for i, name in gernes])
|
||||
}</td></tr>
|
||||
<tr><td>Last Update:</td><td>{as_date(obj['last_date'])}</td></tr>
|
||||
</table>
|
||||
</div>
|
||||
<div id="stats">
|
||||
{ stat(1, 'Number of recordings:', rank['sum_rec'], obj['sum_rec']) }
|
||||
{ stat(1, 'Average recording time:', rank['avg_time'], obj['avg_time'], fmt=seconds_to_time) }
|
||||
{ stat(2, 'Cumulative recording time:', rank['sum_time'], obj['sum_time'], fmt=seconds_to_time) }
|
||||
{ stat(1, 'Average number of requests:', rank['avg_logs_pm'], obj['avg_logs'], obj['avg_logs_pm'], fmt=as_pm, fmt2=round_num) }
|
||||
{ stat(2, 'Total number of requests:', rank['sum_logs_pm'], obj['sum_logs'], obj['sum_logs_pm'], fmt=as_pm, fmt2=str) }
|
||||
{ stat(1, 'Number of domains:', rank['pardom'], len(obj['pardom'])) }
|
||||
{ stat(2, 'Number of subdomains:', rank['subdom'], len(obj['subdom'])) }
|
||||
{ stat(3, 'Tracker percentage:', rank['tracker_percent'], obj['tracker_percent'], fmt=as_percent) }
|
||||
</div>
|
||||
<h3>Connections</h3>
|
||||
<div>
|
||||
<h4>Potential Trackers ({ len(obj['tracker']) }):</h4>
|
||||
{ gen_dom_tags(obj['tracker'], isSub=True, onlyTrackers=True) }
|
||||
<p></p>
|
||||
|
||||
<h4>Domains ({ len(obj['pardom']) }):</h4>
|
||||
{ gen_dotgraph(obj['pardom']) }
|
||||
{ gen_dom_tags(obj['pardom'], isSub=False) }
|
||||
|
||||
<h4>Subdomains ({ len(obj['subdom']) }):</h4>
|
||||
{ gen_dotgraph(obj['subdom']) }
|
||||
{ gen_dom_tags(obj['subdom'], isSub=True) }
|
||||
|
||||
Reference in New Issue
Block a user