broke out dashboard into its own app

This commit is contained in:
2022-06-09 18:44:11 -05:00
parent dab163955b
commit c1bbcc3623
10 changed files with 60 additions and 38 deletions

View File

View File

@@ -0,0 +1,6 @@
from django.apps import AppConfig
class DashboardConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "teamsnap.dashboard"

View File

@@ -0,0 +1,148 @@
{% extends "base.html" %}{% load static %}
{% block title %} {{ title }}{% endblock %}
{% block page_heading %}{% endblock %}
{% block content %}
<h3>Dashboard</h3>
<div class="row">
<div class="col-md pb-2">
<div class="card">
<div class="card-header">
<h4>Upcoming Games</h4>
</div>
<div class="card-body p-0 m-0">
{% for event, availability_summary in events_availabilities|slice:":4" %}
<div class="row m-0 p-2 border-bottom">
<div class="col p-0 m-auto" style="flex: 0 0 100px;">
<div class="d-inline-flex m-0 p-0">
<div class="chart-container" style="height: 100px;width: 100px;">
<canvas id="availability-donut-{{ event.data.id }}" class="availability-donut"
data-event-id="{{ event.data.id }}"
data-available-yes="{{ availability_summary.data.player_going_count }}"
data-available-no="{{ availability_summary.data.player_not_going_count }}"
data-available-maybe="{{ availability_summary.data.player_maybe_count }}"
data-available-unknown="{{ availability_summary.data.player_unknown_count }}"
>
</canvas></div>
</div>
</div>
<div class="col">
<div>
<h4><strong><a class="text-decoration-none text-black" href="{% url 'teamsnap_view_event' team_id=event.data.team_id event_id=event.data.id %}">{{ event.data.formatted_title }}</a></strong></h4>
<h6 class="text-muted mb-2">{{ event.data.start_date|date:"D, F j, g:i A" }}</h6>
<h6 class="text-muted mb-2">{{ event.data.location_name }}</h6>
</div>
<div class="d-flex">
<a class="btn btn-primary btn-sm mx-1" role="button" href="{% url 'teamsnap_edit_lineup' event_ids=event.data.id team_id=event.data.team_id %}">Go to Lineup</a>
<form method="get"
action="{% url 'instagen_generate' team_id=event.data.team_id event_id=event.data.id %}">
<select hidden class="form-select" name="game_id" id="game_id">
<optgroup label="Events">
<option value="" disabled="disabled">Select an event...</option>
<option selected
value="{{ event.data.id }}">{{ event.data.formatted_title }}</option>
</optgroup>
</select>
<input hidden class="form-check-input" type="radio" name="background"
id="backgroundLocation" checked value="location">
<input hidden class="form-check-input" type="radio" name="dimensions" id="square" checked
value="1080x1080">
<button type="submit" class="btn btn-primary btn-sm"><i class="bi bi-instagram"></i>
</button>
</form>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
<div class="col-md pb-2">
<div class="card">
<div class="card-header">
<h4>Past Games</h4>
</div>
<div class="card-body p-0 m-0">
{% for event in ts_events_past|slice:":4" %}
<div class="row m-0 p-2 border-bottom">
<div class="col p-0 m-auto rounded-circle bg-light" style="flex: 0 0 100px;">
<div class="d-inline-flex m-0 p-0">
<div class="d-flex align-items-center justify-content-center" style="height: 100px;width: 100px;">
<h4 class="text-center"><strong>{{ event.data.formatted_results }}</strong></h4>
</div>
</div>
</div>
<div class="col">
<h4 class=""><strong><a class="text-decoration-none text-black" href="{% url 'teamsnap_view_event' team_id=event.data.team_id event_id=event.data.id %}">{{ event.data.formatted_title }}</a></strong></h4>
<h6 class="text-muted mb-2">{{ event.data.start_date|date:"D, F j" }}</h6>
{# <h6 class="text-muted mb-2">{{ event.data.location_name }}</h6><a class="btn btn-primary btn-sm" role="button" href="{% url 'teamsnap_edit_lineup' event_ids=event.data.id team_id=request.user.teamsnapsettings.managed_team.id %}">Go to Lineup</a>#}
<div class="d-flex">
<form method="get"
action="{% url 'instagen_generate' team_id=event.data.team_id event_id=event.data.id %}">
<select hidden class="form-select" name="game_id" id="game_id">
<optgroup label="Events">
<option value="" disabled="disabled">Select an event...</option>
<option selected
value="{{ event.data.id }}">{{ event.data.formatted_title }}</option>
</optgroup>
</select>
<input hidden class="form-check-input" type="radio" name="background"
id="backgroundLocation" checked value="location">
<input hidden class="form-check-input" type="radio" name="dimensions" id="square" checked
value="1080x1080">
<button type="submit" class="btn btn-primary btn-sm"><i class="bi bi-instagram"></i>
</button>
</form>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
</div>
{% endblock %}
{% block inline_javascript %}
<script>
function donut(ctx, yes_count, maybe_count, no_count, unknown_count) {
var style = getComputedStyle(document.body);
const myChart = new Chart(ctx, {
type: 'doughnut',
responsive: 'true',
data: {
datasets: [{
label: 'Availability',
labels: [
'Yes',
'Maybe',
'No',
'Unknown'
],
data: [yes_count, maybe_count, no_count, unknown_count],
backgroundColor: [
style.getPropertyValue('--bs-success'),
style.getPropertyValue('--bs-info'),
style.getPropertyValue('--bs-danger'),
style.getPropertyValue('--bs-secondary')
],
hoverOffset: 4
}]
},
});
}
for (ctx of document.querySelectorAll('.availability-donut')){
donut(ctx,
ctx.dataset.availableYes,
ctx.dataset.availableMaybe,
ctx.dataset.availableNo,
ctx.dataset.availableUnknown,
)
}
</script>
{% endblock %}

View File

@@ -0,0 +1,3 @@
# from django.test import TestCase
# Create your tests here.

View File

@@ -0,0 +1,7 @@
from django.urls import path
from views import dashboard
urlpatterns = [
path("<int:team_id>/dashboard/", dashboard, name="teamsnap_dashboard"),
path("dashboard/", dashboard, name="teamsnap_dashboard"),
]

View File

@@ -0,0 +1,42 @@
import datetime
from django.shortcuts import redirect, render
from teamsnap.views import get_teamsnap_client
def dashboard(request, team_id=None):
if not team_id:
return redirect(
"teamsnap_dashboard", team_id=request.user.preferences.managed_team_id
)
from pyteamsnap.api import AvailabilitySummary, Event
client = get_teamsnap_client(request)
ts_events = Event.search(client, team_id=team_id)
ts_availability_summaries_d = {
a.data["id"]: a for a in AvailabilitySummary.search(client, team_id=team_id)
}
ts_events_future = [
e
for e in ts_events
if e.data["start_date"] > datetime.datetime.now(datetime.timezone.utc)
]
ts_events_past = [
e
for e in reversed(ts_events)
if e.data["start_date"] < datetime.datetime.now(datetime.timezone.utc)
]
return render(
request,
"dashboard.html",
{
"ts_events_future": ts_events_future,
"ts_events_past": ts_events_past,
"events_availabilities": [
(e, ts_availability_summaries_d[e.data["id"]]) for e in ts_events_future
],
},
)