Skip to content

Commit

Permalink
added team results
Browse files Browse the repository at this point in the history
  • Loading branch information
biuti committed Aug 28, 2023
1 parent 57ddd42 commit 0e8422d
Show file tree
Hide file tree
Showing 7 changed files with 292 additions and 5 deletions.
8 changes: 4 additions & 4 deletions airscore/core/result.py
Original file line number Diff line number Diff line change
Expand Up @@ -1247,7 +1247,7 @@ def get_task_team_scoring(filename):
pilots = []
teams = []
all_scores = []
if not formula['country_scoring']:
if not formula['team_scoring']:
print(f'Team Scoring is not available')
return None
pilots_list = [p for p in data['results'] if not p['team'] in [None, '']]
Expand Down Expand Up @@ -1276,7 +1276,7 @@ def get_task_team_scoring(filename):
all_scores.append(t['score'])
for row in pilots:
row['group'] = str(sum(map(lambda x: x > row['team_score'], all_scores)) + 1) + row['group']
return {'teams': teams, 'data': pilots, 'info': data['info'], 'formula': data['formula']}
return {'teams': teams, 'data': pilots, 'info': data['info'], 'formula': data['formula'], 'stats': data['stats']}


def get_comp_team_scoring(filename):
Expand All @@ -1286,7 +1286,7 @@ def get_comp_team_scoring(filename):
"""
data = open_json_file(filename)
formula = data['formula']
if not formula['country_scoring']:
if not formula['team_scoring']:
print(f'Team Scoring is not available')
return None
'''get info: teams list, team size, task codes'''
Expand Down Expand Up @@ -1337,4 +1337,4 @@ def get_comp_team_scoring(filename):
for row in pilots:
row['group'] = str(sum(map(lambda x: x > row['team_score'], all_scores)) + 1) + row['group']

return {'teams': teams, 'data': pilots, 'info': data['info'], 'formula': data['formula']}
return {'teams': teams, 'data': pilots, 'info': data['info'], 'tasks': data['tasks'], 'formula': data['formula'], 'stats': data['stats']}
33 changes: 32 additions & 1 deletion airscore/public/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -338,11 +338,14 @@ def competition(compid: int):
all_tasks = []
layer = {}
country_scores = False
team_scores = False
task_ids = []
overall_available = False
if result_file != 'error':
if result_file['formula'].get('country_scoring') == 1:
country_scores = True
if result_file['formula'].get('team_scoring') == 1:
team_scores = True
overall_available = True
for task in result_file['tasks']:
task_ids.append(int(task['id']))
Expand Down Expand Up @@ -400,7 +403,7 @@ def competition(compid: int):

return render_template('public/comp.html',
tasks=all_tasks, comp=comp, regids=regids, overall_available=overall_available,
country_scores=country_scores)
country_scores=country_scores, team_scores=team_scores)


@blueprint.route('/ext_competition/<int:compid>')
Expand Down Expand Up @@ -580,6 +583,34 @@ def _get_task_country_result(taskid: int):
return get_task_country_scoring(filename)


@blueprint.route('/team_task/<int:taskid>')
def team_task(taskid: int):
return render_template('public/team_task.html', taskid=taskid)


@blueprint.route('/_get_task_team_result/<int:taskid>', methods=['GET'])
def _get_task_team_result(taskid: int):
from task import get_task_json_filename
from result import get_task_team_scoring
filename = get_task_json_filename(taskid)
if not filename:
return render_template('404.html')
return get_task_team_scoring(filename)

@blueprint.route('/team_overall/<int:compid>')
def team_overall(compid: int):
return render_template('public/team_overall.html', compid=compid)


@blueprint.route('/_get_comp_team_result/<int:compid>', methods=['GET'])
def _get_comp_team_result(compid: int):
from compUtils import get_comp_json_filename
from result import get_comp_team_scoring
filename = get_comp_json_filename(compid)
if not filename:
return render_template('404.html')
return get_comp_team_scoring(filename)

class SelectAdditionalTracks(FlaskForm):
track_pilot_list = []
tracks = SelectField('Add Tracks:', choices=track_pilot_list)
Expand Down
83 changes: 83 additions & 0 deletions airscore/static/js/pop_team_overall.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
function populate_team_overall(compid){
$('#comp_name').text('Loading Results ...');

$.ajax({
type: "GET",
url: '/_get_comp_team_result/'+compid,
contentType:"application/json",
dataType: "json",
success: function (json) {

var compid = json.info.id;
var taskNum = json.stats.valid_tasks
console.log('taskNum='+taskNum);
var columns = [];
var idx = 0;
// rankings
//console.log(json.rankings);
// json.rankings.forEach( function(item, index) {
// columns.push({data: 'rankings.'+item.rank_id.toString(), title: '#', name: item.rank_id.toString(), className: "text-right", defaultContent: '', visible: false});
// });
columns.push({data: 'group', title:'Group', className: "text-right", defaultContent: '', visible: false});
columns.push({data: 'score', title:'Total', className: "text-right", defaultContent: '', visible: false});
columns.push({data: 'team_score', title:'Team Total', className: "text-right", defaultContent: '', visible: false});
columns.push({data: 'fai_id', title:'FAI', className: "text-right", defaultContent: '', visible: false});
columns.push({data: 'civl_id', title:'CIVL', className: "text-right", defaultContent: '', visible: false});
columns.push({data: 'name', title:'Name'});
columns.push({data: 'glider', title:'Equip'});
columns.push({data: 'glider_cert', title:'EN', defaultContent: '', visible: false});
columns.push({data: 'nat', title:'NAT', defaultContent: '', visible: false});
columns.push({data: 'sex', title:'Sex', defaultContent: '', visible: false});
columns.push({data: 'sponsor', title:'Sponsor'});
json.tasks.forEach( function(item, index) {
let code = item.task_code
console.log( item.task_code.toString() + ': ' + item.training.toString());
if ( !item.training ) {
columns.push({data: 'results.'+code+'.score', title: code, className: "text-right", defaultContent: ''});
}
});
$('#results_table').dataTable({
data: json.data,
paging: false,
searching: true,
saveState: true,
info: false,
dom: 'lrtip',
columns: columns,
orderFixed: [[3, 'desc'],[2, 'desc']],
rowGroup: {dataSrc: 'group'},
initComplete: function(settings) {
var table= $('#results_table');
var rows = $("tr", table).length-1;
var numCols = table.DataTable().columns().nodes().length;

// comp info
console.log(json.info);
$('#comp_name').text(json.info.comp_name + " - Teams");
$('#comp_date').text(json.info.date_from + ' - ' + json.info.date_to);

// some GAP parameters
$('#formula tbody').append(
"<tr><td>Director</td><td>" + json.info.MD_name + '</td></tr>' +
"<tr><td>Location</td><td>" + json.info.comp_site + '</td></tr>' +
"<tr><td>Formula</td><td>" + json.formula.formula + '</td></tr>' +
"<tr><td>Overall Scoring</td><td>" + json.formula.overall_validity + ' (' + json.formula.validity_param*100 + ')</td></tr>'
);
if (json.formula.overall_validity == 'ftv') {
$('#formula tbody').append("<tr><td>Total Validity</td><td>" + json.stats.tot_validity + '</td></tr>');
}
$("#dhv option").remove(); // Remove all <option> child tags.
// at the moment we provide the highest EN rating for a class and the overall_class_filter.js uses this.
// if we want to be more specific and pass a list of all EN ratings inside a class we can do something like this: https://stackoverflow.com/questions/15759863/get-array-values-from-an-option-select-with-javascript-to-populate-text-fields
$.each(json.rankings, function(index, item) {
$("#dhv").append(
$("<option></option>")
.text(item.rank_name)
.val(item.rank_id)
);
});
}
});
}
});
}
67 changes: 67 additions & 0 deletions airscore/static/js/pop_team_task.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
function populate_team_task(task_id){
$(document).ready(function() {
$('#task_result').dataTable({
ajax: '/_get_task_team_result/'+task_id,
paging: false,
searching: true,
saveState: true,
info: false,
"dom": 'lrtip',
columns: [
{data: 'group', title:'group'},
{data: 'team_score', title:'Team Total'},
{data: 'fai_id', title:'FAI'},
{data: 'civl_id', title:'CIVL'},
{data: 'glider', title:'Equip'},
{data: 'glider_cert', title:'EN'},
{data: 'name', title:'Name'},
{data: 'nat', title:'NAT'},
{data: 'sex', title:'Sex'},
{data: 'sponsor', title:'Sponsor'},
{data: 'score', title:'Total'}

],

orderFixed: [[1, 'desc'],[10, 'desc']],

rowGroup: {
dataSrc: ['group']

},
"columnDefs": [
{
"targets": [ 0, 1, 2, 3, 4, 5],
"visible": false
},
],
"initComplete": function(settings, json)
{
var table= $('#task_result');
var rows = $("tr", table).length-1;
var numCols = $("th", table).length+6;

// task info
$('#comp_name').text(json.info.comp_name)
$('#task_name').text(json.info.task_name + " - Teams");
$('#task_date').text(json.info.date);

// some GAP parameters
$('#formula tbody').append(
"<tr><td>Director</td><td>" + json.info.MD_name + '</td></tr>' +
"<tr><td>Location</td><td>" + json.info.comp_site + '</td></tr>' +
"<tr><td>Formula</td><td>" + json.formula.formula_name + '</td></tr>' +
"<tr><td>Overall Scoring</td><td>" + json.formula.overall_validity);
if (json.formula.overall_validity == 'ftv') {
$('#formula tbody').append(
' (' + json.formula.validity_param*100 + ')</td></tr>' +
"<tr><td>Total Validity</td><td>" + json.stats.total_validity + '</td></tr>');
}
else {
$('#formula tbody').append('</td></tr>');
}


}
});
});
}
7 changes: 7 additions & 0 deletions airscore/templates/public/comp.html
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ <h1 class='my-2' id='comp_name'>{{ comp.comp_name }} - <small>{{ comp.comp_site
{% if country_scores %}
<a href="{{ url_for('public.country_overall', compid=comp.comp_id) }}" class='btn btn-primary ml-3'>Nations</a>
{% endif %}
{% if team_scores %}
<a href="{{ url_for('public.team_overall', compid=comp.comp_id) }}" class='btn btn-primary ml-3'>Teams</a>
{% endif %}
</div>
{% endif %}
<div>
Expand Down Expand Up @@ -101,6 +104,10 @@ <h6>{{ task.comment }}</h6>
<a href="{{ url_for('public.country_task', taskid=task.id) }}" class='btn btn-primary'>Nations</a>
</p>
{% endif %}
{% if team_scores %}
<a href="{{ url_for('public.team_task', taskid=task.id) }}" class='btn btn-primary'>Teams</a>
</p>
{% endif %}
{% endif %}
</div>
</div>
Expand Down
54 changes: 54 additions & 0 deletions airscore/templates/public/team_overall.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
{% extends "base.html"%}

{% block page_title %}
Competition Results - Team
{% endblock %}

{% block head %}
<!-- CSS -->
<link href='/static/css/task.css' rel='stylesheet'>
<!-- JS -->
<script type='text/javascript' src='/static/js/utils.js'></script>
<script type='text/javascript' src='/static/js/microajax.minified.js'></script>
{% endblock %}

{% block content %}
<div class='container-fluid'>
<div class='row'>
<div class='col col-md-7 comp_header mt-1'>
<h2 id='comp_name'></h2>
<h4 id='comp_date'></h4>
<h4 id='comp_director'></h4>
<select name='dhv' id='dhv' class='form-control col-md-4' placeholder='Class'>
<option value='' selected>Open</option>
<option value='A'>Novice</option>
<option value='B'>Fun</option>
<option value='C'>Sports</option>
<option value='D'>Serial</option>
<option value='CCC'>Competition</option>
</select>
</div>
<div class='col col-md-5' class='parameters'>
<table class='table table-sm' id='formula'>
<thead class='thead-light' id='formula_hd'>
<tr>
<th>Information</th>
<th></th>
</tr>
</thead>
<tbody class='small' id='formula_bd'></tbody>
</table>
</div>
</div>
{% from "macros.html" import datatable with context %}
{{ datatable('results_table') }}
</div>
{% endblock %}

{% block js %}
<script type='text/javascript' src='https://cdn.datatables.net/rowgroup/1.1.1/js/dataTables.rowGroup.min.js'></script>
<script type='text/javascript' src='/static/js/enums.js'></script>
<script type='text/javascript' src='/static/js/pop_team_overall.js'></script>
<script src="{{ static_url_for('static', filename='js/class_filter.js') }}"></script>
<script type='text/javascript'>populate_team_overall({{compid|tojson}})</script>
{% endblock %}
45 changes: 45 additions & 0 deletions airscore/templates/public/team_task.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
{% extends "base.html"%}

{% block page_title %}
Task Result - Team
{% endblock %}

{% block head %}
<!-- CSS -->
<link href='/static/css/task.css' rel='stylesheet'>
<!-- JS -->
<script type='text/javascript' src='/static/js/utils.js'></script>
<script type='text/javascript' src='/static/js/microajax.minified.js'></script>
{% endblock %}

{% block content %}
<div class='container-fluid'>
<div class='row'>
<div class='col col-md-7 comp_header mt-1'>
<h2 id='comp_name'></h2>
<h2 id='task_name'></h2>
<h4 id='task_date'></h4>
</div>
<div class='col col-md-5' class='parameters'>
<table class='table table-sm' id='formula'>
<thead class='thead-light' id='formula_hd'>
<tr>
<th>Information</th>
<th></th>
</tr>
</thead>
<tbody class='small' id='formula_bd'></tbody>
</table>
</div>
</div>
{% from "macros.html" import datatable with context %}
{{ datatable('task_result') }}
</div>
{% endblock %}

{% block js %}
<script type='text/javascript' src='https://cdn.datatables.net/rowgroup/1.1.1/js/dataTables.rowGroup.min.js'></script>
<script type='text/javascript' src='/static/js/enums.js'></script>
<script type='text/javascript' src='/static/js/pop_team_task.js'></script>
<script type='text/javascript'>populate_team_task({{taskid|tojson}})</script>
{% endblock %}

0 comments on commit 0e8422d

Please sign in to comment.