first init of rewrite

This commit is contained in:
2022-05-18 14:24:05 -05:00
parent 4632926a34
commit 46da4c8dd4
113 changed files with 974 additions and 468 deletions

View File

@@ -83,9 +83,10 @@ class LineupEntryForm(forms.Form):
event_lineup_id = forms.Field(required=False)
event_id = forms.Field()
member_id = forms.Field()
position_only = forms.BooleanField(initial=False, required=False)
sequence = forms.IntegerField(required=False)
label = forms.ChoiceField(required=False, choices=[
("--", "--"),
("", "--"),
("P","P"),
("C","C"),
("1B","1B"),

View File

@@ -0,0 +1,14 @@
# Generated by Django 3.2.6 on 2022-05-06 15:31
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('teamsnap', '0005_auto_20211224_1042'),
('teamsnap', '0009_alter_availability_status_code'),
]
operations = [
]

View File

@@ -1,12 +1,10 @@
{% extends "base.html" %}{% load static %}
{% block title %} {{ event.data.formatted_title }}{% endblock %}
{% block page_heading %}{{ event.data.formatted_title }}{% endblock %}
{% block page_subheading %}{{ event.data.start_date }}, {{ event.data.location_name }}{% endblock %}
{#{% block title %} {{ event.data.formatted_title }}{% endblock %}#}
{#{% block page_heading %}{{ event.data.formatted_title }}{% endblock %}#}
{#{% block page_subheading %}{{ event.data.start_date }}, {{ event.data.location_name }}{% endblock %}#}
{% block content %}
{% include 'teamsnap/lineup/widgets/lineup.html' with formset_lineup=formset_lineup formset_bench=formset_bench%}
<script src="{% static 'js/Sortable.js' %}"></script>
<script src="{% static 'teamsnap/js/lineup-table.js' %}"></script>
<script src="{% static 'teamsnap/js/lineup-table.js' %}"></script>
{% endblock %}

View File

@@ -1,36 +1,38 @@
{% extends "base.html" %}{% load static %}
{% block title %} {{ title }}{% endblock %}
{% csrf_token %}
{% block page_heading %}
<div class="row d-inline-flex">
<div class="col">
Schedule
Multiple Lineup Edit
</div>
</div>
{% endblock %}
{% block content %}
<form method="get" action="{% url 'teamsnap_edit_multiple_lineups' team_id=team_id%}">
{{ formset.management_form }}
<input class="btn btn-sm btn-outline-primary text-nowrap" type="submit" value="Submit">
{% load tz %}
<form method="post" action="{% url 'teamsnap_choose_multiple_lineups' team_id=team_id%}">
<div class="table-responsive">
<table class="table table-striped table-sm">
{{ formset.management_form }}
{% csrf_token %}
{# <thead>#}
{# </thead>#}
<tbody>
{% for form in formset %}
<tr>
{{ form.event_id }}
<th>Game {{ forloop.counter }}</th>
<td>{{ form.event_id }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<input class="btn btn-sm btn-primary" type="submit" value="Submit">
</form>
<!-- create_normal.html :: part 4 -->
<script type='text/javascript'>

View File

@@ -1,7 +1,7 @@
{% extends "base.html" %}{% load static %}
{% block title %} Edit Lineups {% endblock %}
{% block page_heading %}Edit Lineups{% endblock %}
{% block page_subheading %}{% endblock %}
{#{% block page_heading %}Edit Lineups{% endblock %}#}
{#{% block page_subheading %}{% endblock %}#}
{% block content %}
{# <div class="container overflow-scroll mx-0 px-0">#}
@@ -21,80 +21,17 @@
<div class="row flex-row flex-nowrap">
<table>
<tbody>
<tr>
<tr class="align-top mx-1">
{% for event_data in contexts %}
<td>
<h4>{{ event_data.event.data.formatted_title }}</h4>
<h6 class="text-muted" >{{ event_data.data.start_date }}</h6>
{% with 'P C 1B 2B 3B SS LF CF RF EH DH' as position_list %}
{% for position in position_list.split %}
<span class="position-status fw-bold small px-1" id="position-status-{{ position }}">{{ position }}</span>
{% endfor %}
{% endwith %}
<td class="px-1">
{% include "teamsnap/lineup/widgets/lineup.html" with event=event_data.event event_id=event_data.event.data.id formset=event_data.formset formset_startinglineup=event_data.formset_startinglineup formset_bench=event_data.formset_bench formset_out=event_data.formset_out formset_startingpositionalonly=event_data.formset_startingpositionalonly %}
</td>
{% endfor %}
</tr>
<tr>
<td class="bg-light" colspan="{{ contexts|length }}"><h4>Lineup</h4></td>
</tr>
<tr>
{% for event_data in contexts %}
<td class="align-top">
{% include 'teamsnap/lineup/widgets/lineup_table.html' with formset=event_data.formset_lineup table_id="players-lineup" %}
</td>
{% endfor %}
</tr>
<tr>
<td class="bg-light" colspan="{{ contexts|length }}"><h4>Bench</h4></td>
</tr>
<tr>
{% for event_data in contexts %}
<td class="align-top">
{% include 'teamsnap/lineup/widgets/lineup_table.html' with formset=event_data.formset_bench table_id="players-bench" %}
</td>
{% endfor %}
</tr>
<tr>
<td class="bg-light" colspan="{{ contexts|length }}"><h4>Out</h4></td>
</tr>
<tr>
{% for event_data in contexts %}
<td class="align-top">
{% include 'teamsnap/lineup/widgets/lineup_table.html' with formset=event_data.formset_out table_id="players-bench" %}
</td>
{% endfor %}
</tr>
</tbody>
</table>
{# <div class="align-content-start">#}
{# <div class = "bg-light rounded-3 p-2">#}
{# <div class="row">#}
{# {% with 'P C 1B 2B 3B SS LF CF RF EH DH' as position_list %}#}
{# {% for position in position_list.split %}#}
{# <span class="position-status fw-bold small px-1" id="position-status-{{ position }}">{{ position }}</span>#}
{# {% endfor %}#}
{# {% endwith %}#}
{# </div>#}
{# </div>#}
{# </div>#}
{# <form method="post" action="{% url 'teamsnap_submit_lineup' team_id=team_id event_id=event_id%}">#}
{# {{ formset.management_form }}#}
{# {% csrf_token %}#}
{# <h4 class="border-bottom">Lineup</h4>#}
{# {% include 'teamsnap/lineup/widgets/lineup_table.html' with formset=formset_lineup table_id="players-lineup" %}#}
{# <input class="btn btn-success" type="submit" value="Submit">#}
{##}
{# <h4 class="border-bottom">Bench</h4>#}
{# {% include 'teamsnap/lineup/widgets/lineup_table.html' with formset=formset_bench table_id="players-bench" %}#}
{##}
{# <h4 class="border-bottom">Out</h4>#}
{# {% include 'teamsnap/lineup/widgets/lineup_table.html' with formset=formset_out table_id="players-out" %}#}
{# </form>#}
<script src="{% static 'js/Sortable.js' %}"></script>
<script src="{% static 'teamsnap/js/lineup-table.js' %}"></script>
</div>
</div>
<script src="{% static 'js/Sortable.js' %}"></script>
<script src="{% static 'teamsnap/js/lineup-table.js' %}"></script>
{% endblock %}

View File

@@ -1,28 +1,77 @@
<div>
<div class="align-content-start">
<div class = "bg-light rounded-3 p-2">
{# <div class="row">#}
{% with 'P C 1B 2B 3B SS LF CF RF EH DH' as position_list %}
{% for position in position_list.split %}
<span class="position-status fw-bold small px-1" id="position-status-{{ position }}">{{ position }}</span>
{% endfor %}
{% endwith %}
{# </div>#}
</div>
</div>
<div class="card mx-auto benchcoach-lineup" style="max-width: 455px" id="benchcoach-lineup-{{ event_id }}">
<form method="post" action="{% url 'teamsnap_submit_lineup' team_id=team_id event_id=event_id%}">
{{ formset.management_form }}
{% csrf_token %}
<div class="border-bottom p-2">
<h4 class="card-title text-nowrap">{{ event.data.formatted_title }}</h4>
<h6 class="text-muted card-subtitle text-nowrap">{{ event.data.start_date|date:"D, F j, Y g:i A" }}</h6>
<h4 class="border-bottom">Lineup</h4>
{% include 'teamsnap/lineup/widgets/lineup_table.html' with formset=formset_lineup table_id="players-lineup" %}
<input class="btn btn-success" type="submit" value="Submit">
<div class="row">
<div class="col">
<button class="btn btn-primary btn-sm py-0 m-1" onclick="importFromClipboard(this)" type="button"><i class="bi bi-arrow-90deg-down"></i></i><i class="bi bi-file-spreadsheet"></i> </button>
</div>
<div class="col text-end">
<button class="btn btn-primary btn-sm py-0 m-1" onclick="copyEmailTable(this, '{{ event.data.start_date|date:"D, F j, Y g:i A" }}, {{ event.data.location_name }}, ({% if event.data.game_type == 'Away' %}@{% endif %}{{ event.data.opponent_name }})', '{% for form in formset %}{{ form.member.data.email_addresses.0 }},{% endfor %}')" type="button"><i class="bi bi-arrow-right"></i><i class="bi bi-envelope"></i></button>
<button class="btn btn-primary btn-sm py-0 m-1" onclick="sendToClipboard(this)" type="button"><i class="bi bi-arrow-right"></i><i class="bi bi-file-spreadsheet"></i></button>
<button class="btn btn-success btn-sm py-0 m-1" type="submit"><i class="bi bi-arrow-right"></i><i class="bi bi-asterisk"></i></button>
</div>
</div>
</div>
<h4 class="border-bottom">Bench</h4>
{% include 'teamsnap/lineup/widgets/lineup_table.html' with formset=formset_bench table_id="players-bench" %}
<div class="card-body p-0 m-0">
<div>
<div class="row m-0">
<div class="col border-bottom bg-light">
<i class="bi bi-clipboard-check me-1"></i><span class="text-uppercase fw-bold small">Starting Lineup</span>
</div>
</div>
<h4 class="border-bottom">Out</h4>
{% include 'teamsnap/lineup/widgets/lineup_table.html' with formset=formset_out table_id="players-out" %}
<div class = "row m-0">
<div class="col border-bottom px-0">
<div class="row mx-0 my-1 position-status">
{% with 'P C 1B 2B 3B SS LF CF RF EH DH' as position_list %}
{% for position in position_list.split %}
<div class="col fw-bold text-center small">
<span class="" id="position-status-{{ position }}">{{ position }}</span>
</div>
{% endfor %}
{% endwith %}
</div>
</div>
</div>
{% include 'teamsnap/lineup/widgets/lineup_table.html' with formset=formset_startinglineup table_id="benchcoach-startinglineup" %}
</div>
<div>
<div class="row m-0">
<div class="col border-bottom bg-light">
<i class="bi bi-clipboard-minus me-1"></i><span class="text-uppercase fw-bold small">Starting (Positional Only)</span>
</div>
</div>
{% include 'teamsnap/lineup/widgets/lineup_table.html' with formset=formset_startingpositionalonly table_id="benchcoach-startingpositionalonly" %}
</div>
<div>
<div class="row m-0">
<div class="col border-bottom bg-light">
<i class="bi bi-clipboard me-1"></i><span class="text-uppercase fw-bold small">Bench</span>
</div>
</div>
</div>
{% include 'teamsnap/lineup/widgets/lineup_table.html' with formset=formset_bench table_id="benchcoach-bench" %}
<div>
<div class="row m-0">
<div class="col border-bottom bg-light">
<i class="bi bi-clipboard-x me-1"></i><span class="text-uppercase fw-bold small">Out</span>
</div>
</div>
</div>
{% include 'teamsnap/lineup/widgets/lineup_table.html' with formset=formset_out table_id="benchcoach-out" %}
</div>
</form>
</div>
</div>

View File

@@ -1,29 +1,38 @@
<table class="table table-sm my-0" style="min-height: 1rem" id="table-{{ table_id }}">
<tbody id="tbody-{{ table_id }}">
{% for form in formset %}
<tr data-player-id="{{ form.member.data.id }}"
data-position="{{ form.label.value }}"
data-order="{{ form.sequence.value }}">
{{ form.event_lineup_entry_id.as_hidden }}
{{ form.event_lineup_id.as_hidden }}
{{ form.event_id.as_hidden }}
{{ form.member_id.as_hidden }}
{{ form.sequence.as_hidden }}
{{ form.label.as_hidden }}
{{ form.member_name.as_hidden }}
<th class="col-1" id="sequence-member-{{ form.member.data.id }}">
{{ form.sequence.value | add:"1" }}
</th>
<td class="col-1">
<div class="mx-1">
<span id="player-order-{{ form.member.id }}" class="lineup-sequence-value">
{% if form.order.value > 0 %} {{ form.order.value | add:"1" }} {% endif %}
</span>
<div class="table-responsive">
<table class="table table-sm my-0 table-{{ table_id }}" style="min-height: 1rem">
<tbody class="tbody-{{ table_id }}">
{% for form in formset %}
<tr data-player-id="{{ form.member.data.id }}"
data-position="{{ form.label.value }}"
data-order="{{ form.sequence.value }}"
data-player-name="{{ form.member.data.last_name }}, {{ form.member.data.first_name }}"
data-availability-statuscode="{{ form.availability.data.status_code }}"
>
{{ form.event_lineup_entry_id.as_hidden }}
{{ form.event_lineup_id.as_hidden }}
{{ form.event_id.as_hidden }}
{{ form.member_id.as_hidden }}
{{ form.position_only.as_hidden }}
{{ form.label.as_hidden }}
{{ form.member_name.as_hidden }}
<th class="col-1" id="sequence-member-{{ form.member.data.id }}">
{{ form.sequence.value | add:"1" }}
</th>
<td class="col-1">
<div class="mx-1">
<span id="player-order-form-{{ form.member.id }}" class="lineup-sequence-form">
{{ form.sequence.as_hidden }}
</span>
<span id="player-availability-{{ form.member.id }}" class="member-availability-status small">
<span id="player-order-{{ form.member.id }}" class="lineup-sequence-value">
{% if form.order.value > 0 %}{{ form.order.value | add:"1" }}{% endif %}
</span>
<span id="player-availability-{{ form.member.id }}" class="member-availability-status small">
{% if form.availability.data.status_code == 2 %}
<i class="bi bi-question-circle-fill text-info"></i>
{% elif form.availability.data.status_code == 1 %}
{# <i class="bi bi-check-circle-fill text-success"></i>#}
<i class="bi bi-check-circle-fill text-success"></i>
{% elif form.availability.data.status_code == 0 %}
<i class="bi bi-x-circle-fill text-danger"></i>
@@ -31,29 +40,30 @@
<i class="bi bi-question-circle"></i>
{% endif %}
</span>
</div>
</td>
</div>
</td>
<th class="">
<div class="text-nowrap">
<th class="">
<div class="text-nowrap">
<span class="d-none d-md-inline-block">
{{ form.member.data.first_name }}
</span>
{{ form.member.data.last_name }}
<span class="small text-muted fw-light d-none d-lg-inline-block">
{{ form.member.data.last_name }}
<span class="small text-muted fw-light d-none d-lg-inline-block">
#{{ form.member.data.jersey_number }}
</span>
</div>
{# <br><code><small>{{ form.statline }}</small></code>#}
</th>
<td class="col-2">
{{ form.label }}
</td>
<td class="col-1 drag-handle">
<i class="bi bi-grip-vertical text-secondary"></i>
</td>
{# <td>{{ form.instance.position }}</td>#}
</tr>
{% endfor %}
</tbody>
</table>
</div>
{# <br><code><small>{{ form.statline }}</small></code>#}
</th>
<td class="col-2">
<span class="lineup-label-form">{{ form.label }}</span>
</td>
<td class="col-1 drag-handle">
<i class="bi bi-grip-vertical text-secondary"></i>
</td>
{# <td>{{ form.instance.position }}</td>#}
</tr>
{% endfor %}
</tbody>
</table>
</div>

View File

@@ -1,17 +1,15 @@
{% extends "base.html" %}{% load static %}
{% block title %} {{ title }}{% endblock %}
{% block page_heading %}
<div class="row d-inline-flex">
<div class="col">
Schedule
</div>
<div class="row d-inline-flex" hidden>
<div hidden class="col">
<div class="container m-2">
<div class="container m-2">
<div class="btn-group">
<form action="">
<a class="btn btn-sm btn-outline-primary text-nowrap" href="{% url 'teamsnap_schedule' team_id=team_id%}?filters=no_past">No Past Events</a>
<button class="btn btn-sm btn-outline-primary text-nowrap">Games Only</button>
<a class="btn btn-sm btn-outline-primary text-nowrap" href="{% url 'teamsnap_schedule' team_id=team_id%}?filters=no_past">No Past Events</a>
<button class="btn btn-sm btn-outline-primary text-nowrap">Games Only</button>
</form>
</div>
</div>
@@ -22,26 +20,44 @@
{% endblock %}
{% block content %}
{% load tz %}
<div class="table-responsive">
<table class="table table-striped table-sm">
{# <thead>#}
{# </thead>#}
<tbody>
{% for event in events %}
<tr>
<td>
<a href="{% url 'teamsnap_view_event' event_id=event.data.id team_id=request.user.profile.teamsnapsettings.managed_team.id%}">{{ event.data.formatted_title }}</a>
</td>
<td>
{{ event.data.start_date | localtime}}
</td>
<td>
{{ event.data.location_name }}
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% load tz %}
<div class="m-auto">
<h3 class="mb-2">
Schedule
</h3>
<div class="card">
<div class="card-body p-0">
<div class="table-responsive">
<table class="table table-striped table-sm">
{# <thead>#}
{# </thead>#}
<tbody>
{% for event in events %}
<tr>
<th>
{{ event.data.formatted_title }}
</th>
<td>
{{ event.data.start_date|localtime|date:"D"}}
</td>
<td>
{{ event.data.start_date|localtime|date:"M j, Y"}}
</td>
<td>
{{ event.data.start_date|localtime|date:"g:i A"}}
</td>
<td>
{{ event.data.location_name }}
</td>
<td>
<a class="btn btn-outline-secondary btn-sm" href="{% url 'teamsnap_view_event' event_id=event.data.id team_id=request.user.profile.teamsnapsettings.managed_team.id%}"><i class="bi bi-three-dots"></i></a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -1,24 +1,22 @@
{% extends 'base.html' %}
{% block content %}
<form method="post">
{{ formset.management_form }}{% csrf_token %}
<table class="table">
<tr>
{% for _, field in formset.0.base_fields.items %}
<th>{{ field.label }}</th>
{% endfor %}
</tr>
{% for form in formset %}
<tr>
{% for field in form %}
<td>{{ field }}</td>
<form method="post">
{{ formset.management_form }}{% csrf_token %}
<table class="table">
<tr>
{% for _, field in formset.0.base_fields.items %}
<th>{{ field.label }}</th>
{% endfor %}
</tr>
{% for form in formset %}
<tr>
{% for field in form %}
<td>{{ field }}</td>
{% endfor %}
</tr>
{% endfor %}
</tr>
{% endfor %}
</table>
<input type="submit" value="Submit">
</form>
</table>
<input type="submit" value="Submit">
</form>
{% endblock %}

View File

@@ -1,137 +1,159 @@
{% extends "base.html" %}{% load static %}
{% block title %} {{ event.data.formatted_title }}{% endblock %}
{% block page_heading %}{{ event.data.formatted_title }}{% endblock %}
{% block page_subheading %}{{ event.data.start_date }}, {{ event.data.location_name }}{% endblock %}
{% block content %}
<div class="table-responsive">
<div class="card mx-auto">
<div class="border-bottom p-2">
<h4 class="card-title text-nowrap">{{ event.data.formatted_title }}</h4>
<h6 class="text-muted card-subtitle text-nowrap">{{ event.data.start_date|date:"D, F j, Y g:i A" }}</h6>
</div>
<div class="card-body p-0 m-0">
<div>
<div class="row m-0">
<div class="table-responsive p-0">
<table class="table table-sm">
{# <thead>#}
{# </thead>#}
<tbody>
<tr>
<th scope="col">
Date
</th>
<td>
{{ event.data.start_date|date:"D, F j, Y g:i A" }}
</td>
</tr>
<tr>
<th scope="col">
Opponent
</th>
<td>
<a href="{% url 'teamsnap_opponent' team_id=request.user.profile.teamsnapsettings.managed_team.id id=event.data.opponent_id %}">{{ event.data.opponent_name }}</a>
</td>
</tr>
<tr>
<th scope="col">
Location
</th>
<td>
<a href="{% url 'teamsnap_location' team_id=request.user.profile.teamsnapsettings.managed_team.id id=event.data.location_id %}">{{ event.data.location_name }}</a>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="row m-0">
<div class="col border-bottom">
<i class="bi bi-clipboard-check me-1"></i><span class="text-uppercase fw-bold small">Availabilities</span>
</div>
</div>
<div class="table-responsive p-0">
<table class="table table-sm">
{# <thead>#}
{# <th scope="row">#}
{# <td>Status</td>#}
{# <td>Last</td>#}
{# <td>First</td>#}
{# </th>#}
{# </thead>#}
<tbody>
<tr>
<th scope="col" class="col-1">
<i class="bi bi-check-circle-fill text-success"></i>
</th>
<td>
{{ availability_summary.data.player_going_count }}
</td>
<table class="table table-striped table-sm">
{# <thead>#}
{# </thead>#}
<tbody>
<tr>
<th scope="col">
Date
</th>
<td>
{{ event.data.start_date }}
</td>
</tr>
<tr>
<th scope="col">
Opponent
</th>
<td>
<a href="{% url 'teamsnap_opponent' team_id=request.user.profile.teamsnapsettings.managed_team.id id=event.data.opponent_id %}">{{ event.data.opponent_name }}</a>
</td>
</tr>
<tr>
<th scope="col">
Location
</th>
<td>
<a href="{% url 'teamsnap_location' team_id=request.user.profile.teamsnapsettings.managed_team.id id=event.data.location_id %}">{{ event.data.location_name }}</a>
</td>
</tr>
</tbody>
</table>
</div>
<h3>Availabilities</h3>
<div class="table-responsive">
<table class="table table-striped table-sm">
{# <thead>#}
{# <th scope="row">#}
{# <td>Status</td>#}
{# <td>Last</td>#}
{# <td>First</td>#}
{# </th>#}
{# </thead>#}
<tbody>
<tr>
<th scope="col" class="col-1">
<i class="bi bi-check-circle-fill text-success"></i>
</th>
<td>
{{ availability_summary.data.player_going_count }}
</td>
</tr>
<th scope="col" class="col-1">
<i class="bi bi-question-circle-fill text-info"></i>
</th>
<td>
{{ availability_summary.data.player_maybe_count }}
</td>
<tr>
<th scope="col" class="col-1">
<i class="bi bi-question-circle-fill text-info"></i>
</th>
<td>
{{ availability_summary.data.player_maybe_count }}
</td>
</tr>
<th scope="col" class="col-1">
<i class="bi bi-x-circle-fill text-danger"></i>
</th>
<td>
{{ availability_summary.data.player_not_going_count }}
</td>
<tr>
<th scope="col" class="col-1">
<i class="bi bi-x-circle-fill text-danger"></i>
</th>
<td>
{{ availability_summary.data.player_not_going_count }}
</td>
</tr>
<th scope="col" class="col-1">
<i class="bi bi-question-circle"></i>
</th>
<td>
{{ availability_summary.data.player_unknown_count }}
</td>
</tr>
<tr>
<th scope="col" class="col-1">
<i class="bi bi-question-circle"></i>
</th>
<td>
{{ availability_summary.data.player_unknown_count }}
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="row m-0">
<div class="col border-bottom mb-1">
<i class="bi bi-clipboard me-1"></i><span class="text-uppercase fw-bold small">Lineup</span>
</div>
<div class="flexrow">
<a class="btn btn-primary btn-sm"
href="{% url 'teamsnap_edit_lineup' event_ids=event.data.id team_id=request.user.profile.teamsnapsettings.managed_team.id %}"
role="button">Edit</a>
</div>
<div class="table-responsive p-0">
<table class="table table-striped table-sm">
{# <thead>#}
{# <th scope="row">#}
{# <td>Status</td>#}
{# <td>Last</td>#}
{# <td>First</td>#}
{# </th>#}
{# </thead>#}
<tbody>
{% for lineup_entry in lineup_entries %}
<tr>
</tbody>
</table>
</div>
<div class="">
<h3>Lineup Entries</h3>
<a class="btn btn-primary btn-sm" href="{% url 'teamsnap_edit_lineup' event_id=event.data.id team_id=request.user.profile.teamsnapsettings.managed_team.id%}" role="button">Edit</a>
</div>
<div class="table-responsive">
<table class="table table-striped table-sm">
{# <thead>#}
{# <th scope="row">#}
{# <td>Status</td>#}
{# <td>Last</td>#}
{# <td>First</td>#}
{# </th>#}
{# </thead>#}
<tbody>
{% for lineup_entry in lineup_entries %}
<tr>
<td class="col-1">
{{ lineup_entry.data.sequence }}
</td>
<td>
{{ lineup_entry.data.member_name }}
</td>
<td>
{{ lineup_entry.data.label }}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<h3>Functions</h3>
<div class="">
<form method="get" action="{% url "teamsnap_image_generator_generate" team_id=request.user.profile.teamsnapsettings.managed_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-block"><i class="bi bi-instagram"></i></button>
</form>
<a class="btn btn-primary" href="{% url "teamsnap_image_generator" team_id=request.user.profile.teamsnapsettings.managed_team.id event_id=event.data.id %}" role="button"><div class="d-inline-block"><i class="bi bi-instagram"></i> <i class="bi bi-three-dots"></i></div></a>
</div>
</div>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
<div class="row m-0">
<div class="col border-bottom mb-1">
<i class="bi bi-share"></i><span class="text-uppercase fw-bold small"> Functions</span>
</div>
<div class="row">
<div class="col">
<form method="get"
action="{% url "teamsnap_image_generator_generate" team_id=request.user.profile.teamsnapsettings.managed_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-block"><i class="bi bi-instagram"></i>
</button>
</form>
</div>
<div class="col">
<a class="btn btn-primary"
href="{% url "teamsnap_image_generator" team_id=request.user.profile.teamsnapsettings.managed_team.id event_id=event.data.id %}"
role="button">
<div class="d-inline-block"><i class="bi bi-instagram"></i> <i class="bi bi-three-dots"></i>
</div>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -15,10 +15,10 @@ urlpatterns = [
path('<int:team_id>/schedule/view_event/<int:event_id>', views.event, name='teamsnap_view_event'),
path('<int:team_id>/opponent/view/<int:id>', views.opponent, name='teamsnap_opponent'),
path('<int:team_id>/location/view/<int:id>', views.location, name='teamsnap_location'),
path('<int:team_id>/event/<int:event_id>/edit_lineup/', views.edit_lineup, name='teamsnap_edit_lineup'),
path('<int:team_id>/event/<int:event_ids>/edit_lineup/', views.edit_multiple_lineups, name='teamsnap_edit_lineup'),
path('<int:team_id>/event/<str:event_ids>/edit_lineup/', views.edit_multiple_lineups, 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>/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/edit_lineups', views.edit_multiple_lineups, name='teamsnap_edit_multiple_lineups'),
path('<int:team_id>/multievent/choose', views.multi_lineup_choose, name='teamsnap_choose_multiple_lineups')
]

View File

@@ -11,6 +11,7 @@ from django.contrib.auth.decorators import login_required
from .utils.teamsnap_sync_engine import TeamsnapSyncEngine
from django.templatetags.static import static
import datetime
import re
def edit_event(request, id):
'''
@@ -151,7 +152,6 @@ def schedule(request, team_id):
# ts_locations = {l.data['id']:l for l in Location.search(client, team_id=TEAM_ID)}
# for event in ts_events:
pass
return render(request, "teamsnap/schedule.html", context={"events":ts_events.values(), "team_id":team_id})
@@ -192,7 +192,7 @@ def location(request, id, team_id):
return render(request, "teamsnap/location/view.html", context={"location": Location.get(client, id=id)})
pass
def opponent(request, id):
def opponent(request, team_id, id):
TOKEN = request.user.profile.teamsnap_access_token
from pyteamsnap.api import TeamSnap, Opponent
@@ -215,7 +215,7 @@ def edit_lineup(request, event_id, team_id):
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 = [i for i in ts_bulkload if isinstance(i, EventLineupEntry) and i.data['event_id'] == event_id]
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'])
@@ -261,7 +261,7 @@ def edit_lineup(request, event_id, team_id):
"sequence" : member['lineup_entry'].get('sequence'),
"label" : member['lineup_entry'].get('label'),
}
for member in members
for member in members if not member['member']['is_non_player']
]
)
@@ -289,13 +289,13 @@ def edit_lineup(request, event_id, team_id):
"event_id": event_id,
"event": ts_event,
"formset": formset,
"formset_lineup":formset_lineup,
"formset_startinglineup":formset_lineup,
"formset_bench": formset_bench,
"formset_out": formset_out,
"lineup": ts_lineup
})
def edit_multiple_lineups(request, team_id):
def edit_multiple_lineups(request, team_id, event_ids):
TOKEN = request.user.profile.teamsnap_access_token
from django.forms import formset_factory
from teamsnap.forms import EventChooseForm
@@ -303,18 +303,7 @@ def edit_multiple_lineups(request, team_id):
client = TeamSnap(token=TOKEN)
time.sleep(0.5)
ts_events = Event.search(client, team_id=team_id)
EventChooseFormset = formset_factory(EventChooseForm)
formset = EventChooseFormset(request.GET)
choices = [(e.data['id'], e.data['formatted_title']) for e in ts_events]
for form in formset:
form.fields['event_id'].choices = choices
if formset.is_valid():
event_ids = [f.cleaned_data['event_id'] for f in formset]
else:
event_ids = request.GET.get("event_ids").split(",")
event_ids = str(event_ids).split(",")
ts_bulkload = client.bulk_load(team_id=team_id,
types=[Event, EventLineup, EventLineupEntry, AvailabilitySummary, Member],
@@ -330,7 +319,7 @@ def edit_multiple_lineups(request, team_id):
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 = [i for i in ts_bulkload if isinstance(i, EventLineupEntry) and i.data['event_id'] == event_id]
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'])
@@ -363,39 +352,58 @@ def edit_multiple_lineups(request, team_id):
d['member'].get('last_name'))
)
from teamsnap.forms import LineupEntryFormset, LineupEntryForm
formset = LineupEntryFormset(
initial=[
{
"event_lineup_entry_id" : member['lineup_entry'].get('id'),
"event_lineup_id" : member['lineup_entry'].get('event_lineup_id'),
initial = []
for member in members:
if not member['member']['is_non_player']:
initial_member = {}
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"
initial.append({
"event_lineup_entry_id": member['lineup_entry'].get('id'),
"event_lineup_id": member['lineup_entry'].get('event_lineup_id'),
"event_id": event_id,
"member_id" : member['member']['id'],
"sequence" : member['lineup_entry'].get('sequence'),
"label" : member['lineup_entry'].get('label'),
"position_only": position_only,
"member_id": member['member']['id'],
"sequence": member['lineup_entry'].get('sequence'),
"label": position,
}
for member in members
]
)
formset = LineupEntryFormset(
initial=initial
)
for form in formset:
form.member = ts_member_lookup.get(form['member_id'].initial)
form.availability = ts_availability_lookup.get(form['member_id'].initial)
formset_lineup = [form for form in formset if form.initial.get('event_lineup_entry_id')]
formset_lineup = sorted(
formset_lineup,
formset_startinglineup = [form for form in formset if form.initial.get('event_lineup_entry_id') and not form.initial.get('position_only')]
formset_startinglineup = sorted(
formset_startinglineup,
key=lambda d: d.initial.get('sequence',100)
)
formset_startingpositiononly = [form for form in formset if
form.initial.get('event_lineup_entry_id') and form not in formset_startinglineup]
formset_startingpositiononly = sorted(
formset_startingpositiononly,
key=lambda d: d.initial.get('sequence', 100)
)
formset_bench = [form for form in formset if
form not in formset_lineup and
form not in formset_startinglineup and
form not in formset_startingpositiononly and
form.availability.data['status_code'] in [2, 1]
]
formset_out = [form for form in formset if
form not in formset_lineup and
form not in formset_startinglineup and
form not in formset_bench and
form not in formset_startingpositiononly and
not form.member.data['is_non_player']
]
@@ -403,7 +411,8 @@ def edit_multiple_lineups(request, team_id):
"event":ts_event,
"formset": formset,
"formset_bench":formset_bench,
"formset_lineup":formset_lineup,
"formset_startinglineup":formset_startinglineup,
"formset_startingpositionalonly":formset_startingpositiononly,
"formset_out":formset_out
})
@@ -430,16 +439,30 @@ def submit_lineup(request, team_id, event_id):
data = form.cleaned_data
if data.get('event_lineup_entry_id'):
event_lineup_entry = EventLineupEntry.get(client, id=data.get('event_lineup_entry_id'))
if data.get('position_only'):
data['label'] = data['label'] + ' [PO]'
event_lineup_entry.data.update(data)
# breakpoint()
r.append(event_lineup_entry.put())
# breakpoint()
if not data.get('sequence') and not data.get('label'):
try:
r.append(event_lineup_entry.delete())
except Exception as e:
raise e
else:
try:
r.append(event_lineup_entry.put())
except:
pass
pass
elif data.get('sequence') is not None and data.get('label'):
event_lineup_entry = EventLineupEntry.new(client)
if data.get('position_only'):
data['label'] = data['label'] + ' [PO]'
event_lineup_entry.data.update(data)
event_lineup_entry.data.update({"event_lineup_id":event_lineup_id})
r.append(event_lineup_entry.post())
event_lineup_entry.data.update({"event_lineup_id": event_lineup_id})
try:
r.append(event_lineup_entry.post())
except Exception as e:
raise e
else:
pass
else:
@@ -447,9 +470,8 @@ def submit_lineup(request, team_id, event_id):
pass
# breakpoint()
pass
return HttpResponse(f'{team_id} {event_id}')
return HttpResponse(f'{r}')
pass
return HttpResponse(f'{team_id} {event_id}')
def image_generator(request, team_id, event_id):
@@ -534,9 +556,30 @@ def get_matchup_image(request, team_id, event_id, dimensions=None, background=No
return HttpResponse(imgByteArr, content_type="image/png")
def multi_lineup_choose(request, team_id):
TOKEN = request.user.profile.teamsnap_access_token
from teamsnap.forms import EventChooseForm
from django.forms import formset_factory
if not request.GET.get('num'):
from pyteamsnap.api import TeamSnap, Event
client = TeamSnap(token=TOKEN)
if request.POST:
ts_events = Event.search(client, team_id=team_id)
EventChooseFormset = formset_factory(EventChooseForm)
formset = EventChooseFormset(request.POST)
choices = [(e.data['id'], e.data['formatted_title']) for e in ts_events]
for form in formset:
form.fields['event_id'].choices = choices
if formset.is_valid():
event_ids = [f.cleaned_data['event_id'] for f in formset]
else:
event_ids = request.GET.get("event_ids").split(",")
EventChooseFormset = formset_factory(EventChooseForm)
formset = EventChooseFormset(request.POST)
return redirect('teamsnap_edit_multiple_lineups',team_id=team_id, event_ids=",".join(event_ids))
elif not request.GET.get('num'):
return HttpResponse(500)
else:
num = int(request.GET.get('num'))