Skip to content

Commit

Permalink
Merge 618cc63 into 6bb7863
Browse files Browse the repository at this point in the history
  • Loading branch information
solnsubuga committed Aug 22, 2018
2 parents 6bb7863 + 618cc63 commit 239de5e
Show file tree
Hide file tree
Showing 7 changed files with 163 additions and 1 deletion.
1 change: 1 addition & 0 deletions wger/core/templates/template.html
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@
<script src="{% static 'bower_components/bootstrap/dist/js/bootstrap.min.js' %}"></script>
<script src="{% static 'bower_components/Sortable/Sortable.min.js' %}"></script>
<script src="{% static 'bower_components/d3/d3.js' %}"></script>
<script src="{% static 'bower_components/chart.js/dist/Chart.bundle.min.js' %}"></script>
<script src="{% static 'bower_components/metrics-graphics/dist/metricsgraphics.min.js' %}"></script>
<script src="{% static 'bower_components/devbridge-autocomplete/dist/jquery.autocomplete.min.js' %}"></script>
<script src="{% static 'js/wger-core.js' %}"></script>
Expand Down
101 changes: 101 additions & 0 deletions wger/gym/templates/gym/member_list.html
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,108 @@ <h5 class="modal-title" id="delete-modal-title" style="font-size: 140%; color: #
</div>
</div>

<div class="modal fade" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true" id="error-no-members-modal">
<div class="modal-dialog modal-sm">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
<h4 class="modal-title" id="msg">Select members whose data you want to compare</h4>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>

<div id="compare-members-modal" class="modal fade bs-example-modal-lg" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel">
<div class="modal-dialog modal-lg" role="dialog">
<div class="modal-content">
<div class="modal-body">
<canvas id="comparison-canvas"></canvas>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>

<script>
var selectedUsers = [];
function selectUser(event,id){
if(event.checked == true){
selectedUsers.push(id);
}else{
selectedUsers.pop(id)
}
}

function compareMembers(event){
if(selectedUsers.length === 0){
$("#error-no-members-modal").modal("show");
return
}
var usernames = selectedUsers.join(',');
var colors = [
"#FFB81D","#AA0050","#0033a1","#665EC7","#7C868D","#00a1e0","#0a2240",
"#FF681D","#00A1B0","#B150C5",

]

$.ajax({
url: `/weight/api/members_weight_data/?usernames=${usernames}`,
type: 'GET',
success: function(result) {
var chartData = result.data.map(function(d, i){
return {
label: d.label,
data: d.data,
fill: false,
backgroundColor: colors[i],
borderColor: colors[i],
borderWidth: 2
}
})
chartLabels = result.labels.filter(function(elem, index, self){
return index === self.indexOf(elem)
});
chartLabels = chartLabels.reverse()
var barChartData = {
labels: chartLabels,
datasets: chartData
};

var chartOptions = {
responsive: true,
legend: {
position: "top"
},
title: {
display: true,
text: "Variation of weight with time for member(s):"
},
scales: {
yAxes: [{
ticks: {
beginAtZero: false
}
}]
}
}
var ctx = document.getElementById("comparison-canvas").getContext("2d");
var myBarChart = new Chart(ctx, {
type: 'line',
data: barChartData,
options: chartOptions
});
$("#compare-members-modal").modal('show');
}
});
}

function modifyUser (event) {
var action = event.getAttribute('data-action');
var user = event.getAttribute('data-user');
Expand Down
8 changes: 7 additions & 1 deletion wger/gym/templates/gym/partial_user_list.html
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,11 @@
});
});
</script>

<button class="btn btn-primary" onclick="compareMembers(this)">Compare Members</button>
<table class="table table-hover" id="main_member_list">
<thead>
<tr>
<th></th>
{% for key in user_table.keys %}
<th>{{ key }}</th>
{% endfor %}
Expand All @@ -26,6 +27,11 @@
<tbody>
{% for current_user in user_table.users %}
<tr>
<td>
<input onchange="selectUser(this, `{{current_user.obj.username}}`)"
name="{{current_user.obj}}"
type="checkbox">
</td>
<td>
{{current_user.obj.pk}}
</td>
Expand Down
1 change: 1 addition & 0 deletions wger/settings_global.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@
'sortablejs#1.4.x',
'tinymce',
'tinymce-dist',
'chart.js',
)


Expand Down
26 changes: 26 additions & 0 deletions wger/weight/tests/test_entry.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import decimal

from django.core.urlresolvers import reverse
from django.contrib.auth.models import User

from wger.core.tests import api_base_test
from wger.core.tests.base_testcase import WorkoutManagerAddTestCase
Expand Down Expand Up @@ -78,6 +79,31 @@ def test_access_not_shared(self):
response = self.client.get(url)
self.assertEqual(response.status_code, 404)

def test_get_members_weight_data(self):
user = User.objects.filter(pk=1).first()
if user:
wg = WeightEntry(user=user, weight=85.50, date=datetime.datetime.now())
wg.save()
url = "{0}?usernames={1}".format(reverse('weight:compare-data'), user.username)
self.user_login('admin')
response = self.client.get(url)
self.assertEqual(response.status_code, 200)

def test_get_weight_data(self):
user = User.objects.filter(pk=1).first()
date = datetime.datetime.now().date()
if user:
wg = WeightEntry(user=user, weight=85.50, date=date)
wg.save()
url = reverse('weight:weight-data')
self.user_login('admin')
response = self.client.get(url)
self.assertEqual(response.status_code, 200)

url = "{0}?date_min={1}&date_max={1}".format(url, date)
res = self.client.get(url)
self.assertEqual(res.status_code, 200)


class AddWeightEntryTestCase(WorkoutManagerAddTestCase):
'''
Expand Down
3 changes: 3 additions & 0 deletions wger/weight/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@
url(r'^api/get_weight_data/(?P<username>[\w.@+-]+)$', # JS
views.get_weight_data,
name='weight-data'),
url(r'^api/members_weight_data/$', # JS
views.get_user_weight_data,
name='compare-data'),
url(r'^api/get_weight_data/$', # JS
views.get_weight_data,
name='weight-data'),
Expand Down
24 changes: 24 additions & 0 deletions wger/weight/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
from django.db.models import Max
from django.views.generic import CreateView
from django.views.generic import UpdateView
from django.contrib.auth.models import User

from rest_framework.response import Response
from rest_framework.decorators import api_view
Expand Down Expand Up @@ -190,6 +191,29 @@ def get_weight_data(request, username=None):
return Response(chart_data)


@api_view(['GET'])
def get_user_weight_data(request):
q = request.GET.get('usernames', '')
usernames = q.split(',')
chartData = []
labels = []
for username in usernames:
user = User.objects.filter(username=username).first()
weights = WeightEntry.objects.filter(user=user).order_by('-date')[:5]
data = []
for w in weights:
labels.append(w.date)
data.append(w.weight)
chartData.append({
'label': username,
'data': data
})
return Response({
'labels': labels,
'data': chartData
})


class WeightCsvImportFormPreview(FormPreview):
preview_template = 'import_csv_preview.html'
form_template = 'import_csv_form.html'
Expand Down

0 comments on commit 239de5e

Please sign in to comment.