gamecard v0.1

This commit is contained in:
2022-05-31 07:50:23 -05:00
parent 132fd80e33
commit 67402290c5
87 changed files with 850 additions and 3 deletions

View File

@@ -1 +1,12 @@
@import url("https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.2/font/bootstrap-icons.css");
@import url('https://fonts.googleapis.com/css2?family=Graduate&display=swap');
.wordmark {
font-family: "Graduate", sans-serif;
}
.navbar .navbar-brand {
font-family: "Graduate", sans-serif;
font-weight: bolder;
font-stretch: condensed;
}

View File

@@ -15,6 +15,8 @@ body.A4 .sheet { width: 210mm; height: 296mm }
body.A4.landscape .sheet { width: 297mm; height: 209mm }
body.A5 .sheet { width: 148mm; height: 209mm }
body.A5.landscape .sheet { width: 210mm; height: 147mm }
body.b5 .sheet { width: 176mm; height: 250mm }
body.b5.landscape .sheet { width: 250mm; height: 176mm }
body.letter .sheet { width: 216mm; height: 279mm }
body.letter.landscape .sheet { width: 280mm; height: 215mm }
body.legal .sheet { width: 216mm; height: 356mm }
@@ -26,12 +28,24 @@ body.legal.landscape .sheet { width: 357mm; height: 215mm }
.sheet.padding-20mm { padding: 20mm }
.sheet.padding-25mm { padding: 25mm }
/** For screen preview **/
@media screen {
body { background: #e0e0e0 }
.sheet {
background: white;
box-shadow: 0 .5mm 2mm rgba(0,0,0,.3);
margin: 5mm auto;
}
}
/** Fix for Chrome issue #273306 **/
@media print {
body.A3.landscape { width: 420mm }
body.A3, body.A4.landscape { width: 297mm }
body.A4, body.A5.landscape { width: 210mm }
body.A5 { width: 148mm }
body.b5 { width: 190mm }
body.b5.landscape { width: 250mm }
body.letter, body.legal { width: 216mm }
body.letter.landscape { width: 280mm }
body.legal.landscape { width: 357mm }

View File

@@ -0,0 +1,152 @@
@import url("../../css/paper.css");
@import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
@import url('../fonts/vera/bitstreamvera.css');
@import url('../fonts/verdana/verdanapro.css');
@import url('../fonts/m+1m/m+1m.css');
@import url('../fonts/dinpro/dinpro.css');
@import url('../fonts/refrigerator/refigerator.css');
@import url('https://fonts.googleapis.com/css2?family=Pacifico&display=swap');
@page { size: B5; }
* {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
body {
font-family: "VerdanaPro";
/*font-family: -apple-system;*/
/*font-weight: bold;*/
font-size: 10px;
}
.whole-card {
margin:0;
padding:0;
height: 12.5cm;
width: 17.5cm;
outline: solid black;
margin: auto;
display: flex;
}
.half-card {
margin:0;
padding: .1in;
height: 100%;
width: 50%;
}
card-left {
float: left;
}
card-right {
float: right;
}
.content {
height: 100%;
width: 100%;
/* padding: .1in; */
outline: solid grey;
}
table {
border-collapse: collapse;
empty-cells: show;
font-size:11px;
table-layout: fixed;
white-space: nowrap;
text-overflow: ellipsis;
overflow-x: hidden;
width: 100%;
}
th, tr, td {
/* box-sizing: content-box; */
border: 0.5px solid black;
height: 17px;
text-overflow: ellipsis;
overflow-x: hidden;
}
.gametitle {
font-weight: normal;
text-transform: uppercase;
font-stretch: condensed;
}
.homeaway {
text-transform: uppercase;
font-stretch: normal;
font-weight: bolder;
}
.numbercell {
font-family: "m+1m";
text-align: center;
font-stretch: condensed;
font-size: 10px;
}
.statscell {
font-family: "m+1m";
text-align: center;
font-stretch: extra-condensed;
font-size: 9px;
width: 60px;
}
tr:nth-child(even) {background-color: #f2f2f2;}
th{
background: black;
color: white;
border: none;
}
.customcol{
width: 120px;
text-transform: uppercase;
}
.condensedNameCell{
width: 70px;
text-transform: uppercase;
font-stretch: condensed;
}
.square {
height: 14px;
width: 14px;
}
.available-status-code-1{
background-color: #B7E1CD;
}
.available-status-code-0{
background-color: #F4C7C3;
}
.available-status-code-2{
background-color: #ACC9FE;
}
.starting{
font-weight: bold;
}
.grid-container {
display: flex;
grid-template-columns: auto auto auto;
/*background-color: #2196F3;*/
/*padding: 10px;*/
}
.grid-item {
/*background-color: rgba(255, 255, 255, 0.8);*/
/*border: 1px solid rgba(0, 0, 0, 0.8);*/
/*padding: 20px;*/
font-size: 30px;
text-align: center;
}

View File

@@ -0,0 +1,123 @@
@font-face {
font-family: "DINPro";
font-weight: 800;
src: url("DINPro-Black.otf") format("opentype");
}
@font-face {
font-family: "DINPro";
font-weight: 800;
font-style: italic;
src: url("DINPro-BlackItalic.otf") format("opentype");
}
@font-face {
font-family: "DINPro";
font-weight: bold;
src: url("DINPro-Bold.otf") format("opentype");
}
@font-face {
font-family: "DINPro";
font-weight: bold;
font-style: italic;
src: url("DINPro-BoldItalic.otf") format("opentype");
}
@font-face {
font-family: "DINPro";
font-stretch: condensed;
src: url("DINPro-Cond.otf") format("opentype");
}
@font-face {
font-family: "DINPro";
font-stretch: condensed;
font-weight: 800;
src: url("DINPro-CondBlack.otf") format("opentype");
}
@font-face {
font-family: "DINPro";
font-stretch: condensed;
font-weight: 800;
font-style: italic;
src: url("DINPro-CondBlackIta.otf") format("opentype");
}
@font-face {
font-family: "DINPro";
font-stretch: condensed;
font-weight: bold;
src: url("DINPro-CondBold.otf") format("opentype");
}
@font-face {
font-family: "DINPro";
font-stretch: condensed;
font-weight: bold;
font-style: italic;
src: url("DINPro-CondBoldIta.otf") format("opentype");
}
@font-face {
font-family: "DINPro";
font-stretch: condensed;
font-style: italic;
src: url("DINPro-CondIta.otf") format("opentype");
}
@font-face {
font-family: "DINPro";
font-stretch: condensed;
font-weight: 300;
src: url("DINPro-CondLight.otf") format("opentype");
}
@font-face {
font-family: "DINPro";
font-stretch: condensed;
font-weight: 300;
font-style: italic;
src: url("DINPro-CondLightIta.otf") format("opentype");
}
@font-face {
font-family: "DINPro";
font-stretch: condensed;
font-: Medi;
font-style: italic;
src: url("DINPro-CondMediIta.otf") format("opentype");
}
@font-face {
font-family: "DINPro";
font-stretch: condensed;
font-: Medium;
src: url("DINPro-CondMedium.otf") format("opentype");
}
@font-face {
font-family: "DINPro";
font-style: italic;
src: url("DINPro-Italic.otf") format("opentype");
}
@font-face {
font-family: "DINPro";
font-weight: 300;
src: url("DINPro-Light.otf") format("opentype");
}
@font-face {
font-family: "DINPro";
font-weight: 300;
font-style: italic;
src: url("DINPro-LightItalic.otf") format("opentype");
}
@font-face {
font-family: "DINPro";
font-: Medium;
src: url("DINPro-Medium.otf") format("opentype");
}
@font-face {
font-family: "DINPro";
font-: Medium;
font-style: italic;
src: url("DINPro-MediumItalic.otf") format("opentype");
}
@font-face {
font-family: "DINPro";
font-style: normal;
font-weight: normal;
src: url("DINPro.otf") format("opentype");
}

View File

@@ -0,0 +1,39 @@
@font-face {
font-family: 'm+1m';
src: url('mplus-1m-bold-webfont.woff') format('woff');
font-weight: bold;
font-style: normal;
}
@font-face {
font-family: 'm+1m';
src: url('mplus-1m-light-webfont.woff') format('woff');
font-weight: 300;
font-style: normal;
}
@font-face {
font-family: 'm+1m';
src: url('mplus-1m-medium-webfont.woff') format('woff');
font-weight: 500;
font-style: normal;
}
@font-face {
font-family: 'm+1m';
src: url('mplus-1m-regular-webfont.woff') format('woff');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'm+1m';
src: url('mplus-1m-thin-webfont.woff') format('woff');
font-weight: 100;
font-style: normal;
}

View File

@@ -0,0 +1,26 @@
@font-face {
font-family: "refigerator";
font-weight: bold;
src: url("refrigerator-deluxe-bold.otf") format("opentype");
}
@font-face {
font-family: "refigerator";
font-weight: extrabold;
src: url("refrigerator-deluxe-extrabold.otf") format("opentype");
}
@font-face {
font-family: "refigerator";
font-weight: heavy;
src: url("refrigerator-deluxe-heavy.otf") format("opentype");
}
@font-face {
font-family: "refigerator";
font-weight: light;
src: url("refrigerator-deluxe-light.otf") format("opentype");
}
@font-face {
font-family: "refigerator";
font-weight: normal;
font-style: normal;
src: url("refrigerator-deluxe.otf") format("opentype");
}

View File

@@ -0,0 +1,74 @@
@font-face {
font-family: 'Bitstream Vera Sans';
src: url('Vera-Bold-webfont.woff') format('woff');
font-weight: bold;
font-style: normal;
}
@font-face {
font-family: 'Bitstream Vera Sans';
src: url('Vera-Bold-Italic-webfont.woff') format('woff');
font-weight: bold;
font-style: oblique;
}
@font-face {
font-family: 'Bitstream Vera Sans';
src: url('Vera-Italic-webfont.woff') format('woff');
font-weight: normal;
font-style: oblique;
}
@font-face {
font-family: 'Bitstream Vera Sans';
src: url('Vera-webfont.woff') format('woff');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Bitstream Vera Sans Mono';
src: url('VeraMono-Bold-webfont.woff') format('woff');
font-weight: bold;
font-style: normal;
}
@font-face {
font-family: 'Bitstream Vera Sans Mono';
src: url('VeraMono-Bold-Italic-webfont.woff') format('woff');
font-weight: bold;
font-style: italic;
}
@font-face {
font-family: 'Bitstream Vera Sans Mono';
src: url('VeraMono-Italic-webfont.woff') format('woff');
font-weight: normal;
font-style: italic;
}
@font-face {
font-family: 'Bitstream Vera Sans Mono';
src: url('VeraMono-webfont.woff') format('woff');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Bitstream Vera Sans Mono';
src: url('VeraMono-webfont.woff') format('woff');
font-weight: 800;
font-style: normal;
}

View File

@@ -0,0 +1,123 @@
@font-face {
font-family: 'VerdanaPro';
src: url('VerdanaPro-Black.ttf') format('truetype');
font-weight: 800;
font-style: normal;
}
@font-face {
font-family: 'VerdanaPro';
src: url('VerdanaPro-BlackItalic.ttf') format('truetype');
font-weight: 800;
font-style: italic;
}
@font-face {
font-family: 'VerdanaPro';
src: url('VerdanaPro-Bold.ttf') format('truetype');
font-weight: bold;
font-style: normal;
}
@font-face {
font-family: 'VerdanaPro';
src: url('VerdanaPro-BoldItalic.ttf') format('truetype');
font-weight: bold;
font-style: italic;
}
@font-face {
font-family: 'VerdanaPro';
src: url('VerdanaPro-CondBlack.ttf') format('truetype');
font-stretch: condensed;
font-weight: 800;
}
@font-face {
font-family: 'VerdanaPro';
src: url('VerdanaPro-CondBlackItalic.ttf') format('truetype');
font-stretch: condensed;
font-weight: 800;
font-style: italic;
}
@font-face {
font-family: 'VerdanaPro';
src: url('VerdanaPro-CondBold.ttf') format('truetype');
font-stretch: condensed;
font-weight: bold;
}
@font-face {
font-family: 'VerdanaPro';
src: url('VerdanaPro-CondBoldItalic.ttf') format('truetype');
font-stretch: condensed;
font-weight: bold;
font-style: italic;
}
@font-face {
font-family: 'VerdanaPro';
src: url('VerdanaPro-CondItalic.ttf') format('truetype');
font-stretch: condensed;
font-style: italic;
}
@font-face {
font-family: 'VerdanaPro';
src: url('VerdanaPro-CondLight.ttf') format('truetype');
font-stretch: condensed;
font-weight: 300;
}
@font-face {
font-family: 'VerdanaPro';
src: url('VerdanaPro-CondLightItalic.ttf') format('truetype');
font-stretch: condensed;
font-weight: 300;
font-style: italic;
}
@font-face {
font-family: 'VerdanaPro';
src: url('VerdanaPro-CondRegular.ttf') format('truetype');
font-stretch: condensed;
font-style: normal;
}
@font-face {
font-family: 'VerdanaPro';
src: url('VerdanaPro-CondSemiBold.ttf') format('truetype');
font-stretch: condensed;
font-weight: 600;
}
@font-face {
font-family: 'VerdanaPro';
src: url('VerdanaPro-CondSemiBoldItalic.ttf') format('truetype');
font-stretch: condensed;
font-weight: 600;
font-style: italic;
}
@font-face {
font-family: 'VerdanaPro';
src: url('VerdanaPro-Italic.ttf') format('truetype');
font-style: italic;
font-weight: normal;
}
@font-face {
font-family: 'VerdanaPro';
src: url('VerdanaPro-Light.ttf') format('truetype');
font-weight: 300;
}
@font-face {
font-family: 'VerdanaPro';
src: url('VerdanaPro-LightItalic.ttf') format('truetype');
font-weight: 300;
font-style: italic;
}
@font-face {
font-family: 'VerdanaPro';
src: url('VerdanaPro-Regular.ttf') format('truetype');
font-style: normal;
font-weight: normal;
}
@font-face {
font-family: 'VerdanaPro';
src: url('VerdanaPro-SemiBold.ttf') format('truetype');
font-weight: 600;
font-style: normal;
}
@font-face {
font-family: 'VerdanaPro';
src: url('VerdanaPro-SemiBoldItalic.ttf') format('truetype');
font-weight: 600;
font-style: italic;
}

View File

@@ -0,0 +1,191 @@
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="{% static 'teamsnap/css/gamecard.css' %}">
<title>Title</title>
</head>
<body class="b5">
<section class="sheet">
<div class="whole-card">
<div class="half-card">
<div class="content card-left">
<table>
<thead>
<tr>
<th colspan="8" class="gametitle">
{{ event.data.formatted_title }} {{ event.data.start_date|date:'m/d/Y g:i A' }}
{# G#01 at Browns 05/01/2021 12:30 PM#}
</th>
<th class="homeaway" colspan="4">{{ event.data.game_type }}</th>
</tr>
</thead>
</table>
<table>
<thead>
<tr>
<th class="numbercell">
</td>
<th class="customcol">
</td>
<th class="numbercell">
</td>
<th class="numbercell">
</td>
<th class="numbercell">1
</td>
<th class="numbercell">2
</td>
<th class="numbercell">3
</td>
<th class="numbercell">4
</td>
<th class="numbercell">5
</td>
<th class="numbercell">6
</td>
<th class="numbercell">7
</td>
<th class="numbercell">X
</td>
</tr>
</thead>
<tbody>
{% for member in members_startinglineup %}
<tr>
<td class="numbercell">{{ member.lineup_entry.sequence | add:"1" }}</td>
<td class="customcol">{{ member.member.last_name }}</td>
<td class="numbercell">{{ member.member.jersey_number }}</td>
<td class="numbercell">{{ member.lineup_entry.label }}</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
{% endfor %}
</tbody>
</table>
<table>
<tbody>
{% for member in members_startingpositiononly %}
<tr>
<td class="numbercell"></td>
<td class="customcol">{{ member.member.last_name }}</td>
<td class="numbercell">{{ member.member.jersey_number }}</td>
<td class="numbercell">{{ member.lineup_entry.label }}</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
<div class="half-card">
<div class="content card-right">
<table class="tg">
<thead>
<tr>
<th class="numbercell"></th>
<th class="numbercell"></th>
<th class="condensedNameCell">Available</th>
<th class="statscell">AVG/OBP/SLG:PA</th>
<th class="numbercell"></th>
<th class="numbercell"></th>
<th class="numbercell"></th>
<th class="numbercell"></th>
<th class="numbercell"></th>
<th class="numbercell"></th>
<th class="numbercell"></th>
<th class="numbercell"></th>
<th class="numbercell"></th>
<th class="numbercell"></th>
<th class="numbercell"></th>
<th class="numbercell"></th>
</tr>
</thead>
<tbody>
{% for member in members %}
<tr>
<td class="numbercell"></td>
<td class="numbercell available-status-code-{{ member.availability.status_code }}">{{ member.member.jersey_number }}</td>
<td class="condensedNameCell available-status-code-{{ member.availability.status_code }}">{{ member.member.last_name }}</td>
<td class="statscell"></td>
<td class="numbercell"></td>
<td class="numbercell"></td>
<td class="numbercell"></td>
<td class="numbercell"></td>
<td class="numbercell"></td>
<td class="numbercell"></td>
<td class="numbercell"></td>
<td class="numbercell"></td>
<td class="numbercell"></td>
<td class="numbercell"></td>
<td class="numbercell"></td>
<td class="numbercell"></td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
<div class="whole-card">
<div class="half-card">
<div class="content card-left"></div>
</div>
<div class="half-card">
<div class="content card-right">
<div>
<table>
<thead>
<tr>
<th class="numbercell" style="background-color: #323669">
{{ event.data.start_date|date:"D, F j, Y g:i A" }}
</th>
</tr>
<tr>
<th class="numbercell" style="background-color: #323669">
{{ event.data.location_name }}
</th>
</tr>
<tr>
<th class="numbercell" style="background-color: lightgray">
</th>
</tr>
</thead>
</table>
<div>
<div class="" width="100%">
<img src="{% static 'teamsnap/ig/logos/hounds.png' %}"
height="120px"
>
</div>
<div class="" width="100%" style="text-align: center;font-size: xxx-large; font-family: Pacifico">
VS.
</div>
<div class="" width="100%" style="text-align: right">
<img src="{% static 'teamsnap/ig/logos/hounds.png' %}"
width="120px"
>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
</body>
</html>

View File

@@ -19,6 +19,7 @@ urlpatterns = [
path('<int:team_id>/event/<int:event_ids>/edit_lineup/', views.edit_lineup, name='teamsnap_edit_lineup'),
path('<int:team_id>/event/<str:event_ids>/edit_lineup/', views.edit_lineup, name='teamsnap_edit_multiple_lineups'),
path('<int:team_id>/event/<int:event_id>/submit_lineup/', views.submit_lineup, name='teamsnap_submit_lineup'),
path('<int:team_id>/event/<int:event_id>/gamecard/', views.gamecard, name='teamsnap_gamecard'),
path('<int:team_id>/event/<int:event_id>/image_generator/', views.image_generator, name='teamsnap_image_generator'),
path('<int:team_id>/event/<int:event_id>/image_generator/generate', views.get_matchup_image, name='teamsnap_image_generator_generate'),
path('<int:team_id>/multievent/choose', views.multi_lineup_choose, name='teamsnap_choose_multiple_lineups')

View File

@@ -550,3 +550,96 @@ def multi_lineup_choose(request, team_id):
pass
return render(request, "teamsnap/lineup/multiple_choose.html", context={"formset": formset, "team_id": team_id})
def gamecard(request, team_id, event_id):
TOKEN = request.user.profile.teamsnap_access_token
from django.forms import formset_factory
from teamsnap.forms import EventChooseForm
from pyteamsnap.api import TeamSnap, Event, Availability, Member, EventLineupEntry, EventLineup, \
AvailabilitySummary, Opponent
client = TeamSnap(token=TOKEN)
time.sleep(0.5)
ts_bulkload = client.bulk_load(team_id=team_id,
types=[Event, EventLineup, EventLineupEntry, AvailabilitySummary, Member],
event__id=event_id)
formsets_lineup = []
formsets_bench = []
formsets = []
events = []
contexts = []
ts_event = [i for i in ts_bulkload if isinstance(i, Event) and i.data['id'] == event_id][0]
ts_availabilities = Availability.search(client, event_id=ts_event.data['id'])
ts_availability_summary = \
[i for i in ts_bulkload if isinstance(i, AvailabilitySummary) and i.data['event_id'] == event_id][0]
ts_lineup_entries = EventLineupEntry.search(client, event_id=event_id)
if ts_lineup_entries:
ts_lineup = EventLineup.get(client, id=ts_lineup_entries[0].data['event_lineup_id'])
else:
ts_lineup = EventLineup.search(client, event_id=event_id)
ts_members = [i for i in ts_bulkload if isinstance(i, Member)]
ts_member_lookup = {m.data['id']: m for m in ts_members}
ts_availability_lookup = {m.data['member_id']: m for m in ts_availabilities}
ts_lineup_entries_lookup = {m.data['member_id']: m for m in ts_lineup_entries}
members = []
for member in ts_members:
if not member.data['is_non_player']:
members.append({
"member": getattr(member, 'data'),
"availability": getattr(ts_availability_lookup.get(member.data['id'], {}), 'data', {}),
"lineup_entry": getattr(ts_lineup_entries_lookup.get(member.data['id'], {}), 'data', {})
}
)
members = sorted(members, key=lambda d: (
{
None: 3, # No Response
0: 2, # No
2: 1, # Maybe
1: 0 # Yes
}.get(d['availability'].get('status_code')),
d['member'].get('last_name'))
)
members_startinglineup = []
members_startingpositiononly = []
for member in members:
if re.search(r'([A-Z0-9]+)(?:\s+\[(.*)\])?', member['lineup_entry'].get('label', '')):
position, position_note = re.search(r'([A-Z0-9]+)(?:\s+\[(.*)\])?',
member['lineup_entry'].get('label', '')).groups()
else:
position, position_note = ("", "")
position_only = position_note == "PO"
if position_only:
member['lineup_entry']['label'] = position
if member['lineup_entry'].get('id') and not position_only:
members_startinglineup.append(member)
elif member['lineup_entry'].get('id') and position_only:
members_startingpositiononly.append(member)
members_startinglineup = sorted(
members_startinglineup,
key=lambda d: d.get('lineup_entry',{}).get('sequence', 100)
)
from teamsnap.forms import LineupEntryFormset, LineupEntryForm
initial = []
l=[]
# l = [(member,ts_availability_lookup.get(member['member_id'])) for member in members if not member['is_non_player']]
context={
"event": ts_event,
"members": members,
"members_startinglineup":members_startinglineup,
"members_startingpositiononly":members_startingpositiononly
}
return render(request, "teamsnap/lineup/gamecard.html", context=context)