updates. submits lineups. harmonization between bench and lineup still needs work.
changes order of choices in position so EH is on top known issuees: an order of 0 will get over ridden maybe need a "DHd" flag still not harmonized means cannot drag from lineup to bench.
This commit is contained in:
@@ -6,14 +6,13 @@ from django.forms import modelformset_factory, inlineformset_factory, BaseModelF
|
|||||||
from crispy_forms.helper import FormHelper, Layout
|
from crispy_forms.helper import FormHelper, Layout
|
||||||
|
|
||||||
class PositioningForm(forms.ModelForm):
|
class PositioningForm(forms.ModelForm):
|
||||||
available = forms.TextInput()
|
availability = None
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Positioning
|
model = Positioning
|
||||||
widgets = {
|
widgets = {
|
||||||
'order': forms.NumberInput(attrs={'class':'w-100'}),
|
# 'order': forms.NumberInput(attrs={'class':'w-100'}),
|
||||||
# 'player': forms.Select(attrs={'class': 'form-control'}),
|
# 'player': forms.Select(attrs={'class': 'form-control'}),
|
||||||
'position': forms.Select(attrs={'class': 'w-100'}),
|
'position': forms.Select(attrs={'class': 'form-control form-control-sm'}),
|
||||||
# 'ordering': forms.NumberInput(attrs={'class':'w-100'})
|
# 'ordering': forms.NumberInput(attrs={'class':'w-100'})
|
||||||
}
|
}
|
||||||
exclude = ()
|
exclude = ()
|
||||||
@@ -22,8 +21,9 @@ PositioningFormSet = modelformset_factory(
|
|||||||
model=Positioning,
|
model=Positioning,
|
||||||
form=PositioningForm,
|
form=PositioningForm,
|
||||||
# fields=['order', 'position','player'],
|
# fields=['order', 'position','player'],
|
||||||
min_num=9,
|
# min_num=9,
|
||||||
can_order=True
|
extra=0
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# class PositioningFormSet(modelformset_factory):
|
# class PositioningFormSet(modelformset_factory):
|
||||||
|
|||||||
18
lineups/migrations/0005_alter_positioning_position.py
Normal file
18
lineups/migrations/0005_alter_positioning_position.py
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 3.2.6 on 2021-11-18 23:37
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('lineups', '0004_alter_availability_available'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='positioning',
|
||||||
|
name='position',
|
||||||
|
field=models.CharField(choices=[('EH', 'EH'), ('P', 'P'), ('C', 'C'), ('1B', '1B'), ('2B', '2B'), ('3B', '3B'), ('SS', 'SS'), ('LF', 'LF'), ('CF', 'CF'), ('RF', 'RF'), ('DH', 'DH')], default=None, max_length=2, null=True),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -7,6 +7,7 @@ class Positioning(models.Model):
|
|||||||
player = models.ForeignKey(Player, on_delete=models.CASCADE)
|
player = models.ForeignKey(Player, on_delete=models.CASCADE)
|
||||||
event = models.ForeignKey(Event, on_delete=models.CASCADE)
|
event = models.ForeignKey(Event, on_delete=models.CASCADE)
|
||||||
positions = [
|
positions = [
|
||||||
|
('EH', 'EH'),
|
||||||
('P', 'P'),
|
('P', 'P'),
|
||||||
('C', 'C'),
|
('C', 'C'),
|
||||||
('1B', '1B'),
|
('1B', '1B'),
|
||||||
@@ -16,8 +17,7 @@ class Positioning(models.Model):
|
|||||||
('LF', 'LF'),
|
('LF', 'LF'),
|
||||||
('CF', 'CF'),
|
('CF', 'CF'),
|
||||||
('RF', 'RF'),
|
('RF', 'RF'),
|
||||||
('DH','DH'),
|
('DH','DH')
|
||||||
('EH','EH')
|
|
||||||
]
|
]
|
||||||
position = models.CharField(choices=positions, default=None, max_length=2, null=True)
|
position = models.CharField(choices=positions, default=None, max_length=2, null=True)
|
||||||
order = models.IntegerField(default=None, null=True)
|
order = models.IntegerField(default=None, null=True)
|
||||||
|
|||||||
@@ -6,12 +6,13 @@
|
|||||||
{{ event.start|date:"l, F j, Y g:i A" }} <br>
|
{{ event.start|date:"l, F j, Y g:i A" }} <br>
|
||||||
{{ event.venue.name }} <br>
|
{{ event.venue.name }} <br>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row">
|
|
||||||
<form action="{% url 'edit lineup' event_id=event.id%}" method="post">
|
<form action="{% url 'edit lineup' event_id=event.id%}" method="post">
|
||||||
|
<div class="row">
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<h5>Lineup</h5>
|
<h5>Lineup</h5>
|
||||||
<table class="table">
|
<table class="table">
|
||||||
|
{% csrf_token %}
|
||||||
|
{{ formset.management_form }}
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="col">#</th>
|
<th scope="col">#</th>
|
||||||
@@ -20,68 +21,83 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody id="lineup">
|
<tbody id="lineup">
|
||||||
{#{% for player in positionings_players_initial|dictsort:"positioning.order" %}#}
|
{% for form in formset %}
|
||||||
{% csrf_token %}
|
{% if form.instance.order or form.instance.position == "P" %}
|
||||||
{{ formset_starting.management_form }}
|
<tr data-player-id="{{ form.instance.player.id }}"
|
||||||
{% for form in formset_starting %}
|
data-position="{{ form.instance.position }}"
|
||||||
<tr data-player-id="{{ player.id }}",
|
data-order="{{ form.instance.order }}">
|
||||||
data-positioning-position="{{ form.instance.player.positioning.position }}"
|
{{ form.id.as_hidden }}
|
||||||
>
|
{{ form.event.as_hidden }}
|
||||||
{# <th scope="row">{{ form.order }}</th>#}
|
{{ form.order.as_hidden }}
|
||||||
{# <td>{{ form.player }}</td>#}
|
{{ form.player.as_hidden }}
|
||||||
{# <td>{{ form.position }}</td>#}
|
<th scope="row" id="player-order-{{ form.instance.player.id }}">{% if form.order.value %}{{ form.order.value }}{% endif %}</th>
|
||||||
<th scope="row">{% if form.instance.order %}{{ form.instance.order }}{% endif %}</th>
|
<th>{{ form.instance.player.first_name }} {{ form.instance.player.last_name }} - # {{ form.instance.player.jersey_number }}</th>
|
||||||
<th>{{ form.instance.player.first_name }} {{ form.instance.player.last_name }}</th>
|
<td>{{ form.position }}</td>
|
||||||
<td>{{ form.instance.position }}</td>
|
{# <td>{{ form.instance.position }}</td>#}
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
{# {% endfor %}#}
|
|
||||||
<input type="submit" value="Submit">
|
<input type="submit" value="Submit">
|
||||||
</form>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<h5>Players</h5>
|
<h5>Players</h5>
|
||||||
<div class="col-md-6">
|
|
||||||
<table class="table">
|
<table class="table">
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="col"></th>
|
<th scope="col" style="display: none"></th>
|
||||||
|
<th scope="col">Ava.</th>
|
||||||
<th scope="col">Name</th>
|
<th scope="col">Name</th>
|
||||||
<th scope="col">#</th>
|
<th scope="col">Pos</th>
|
||||||
<th scope="col">Statline</th>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tbody id="bench">
|
<tbody id="bench">
|
||||||
{% for form in formset_bench %}
|
{% for form in formset|dictsortreversed:"availability.available"%}
|
||||||
{% if not player.positioning.order and not player.positioning.position == "P" %}
|
{% if not form.instance.order and not form.instance.position == "P" %}
|
||||||
|
|
||||||
<tr data-player-id="{{ pos.player.id }}">
|
<tr data-player-id="{{ pos.player.id }}">
|
||||||
|
{{ form.id.as_hidden }}
|
||||||
|
{{ form.event.as_hidden }}
|
||||||
|
{{ form.order.as_hidden}}
|
||||||
|
{{ form.player.as_hidden }}
|
||||||
|
<th style="display: none" id="player-order-{{ form.instance.player.id }}">{{ form.order.value }}</th>
|
||||||
<td>
|
<td>
|
||||||
{% if pos.player.availability.available == 2 %}
|
|
||||||
<img class="bg-success p-2 rounded-circle" width="5" height="5"><span class="visually-hidden">Yes</span></img>
|
{% if form.availability.available == 2 %}
|
||||||
{% elif pos.player.availability.available == 1%}
|
<img class="bg-success p-2 rounded-circle" width="5" height="5" id="player-available-{{ form.instance.player.id }}"><span class="visually-hidden">Yes</span></img>
|
||||||
<img class="bg-info p-2 rounded-circle" width="5" height="5"><span class="visually-hidden">Maybe</span></span>
|
{% elif form.availability.available == 1%}
|
||||||
{% elif pos.player.availability.available == 0%}
|
<img class="bg-info p-2 rounded-circle" width="5" height="5" id="player-available-{{ form.instance.player.id }}"><span class="visually-hidden">Maybe</span></span>
|
||||||
<img class="bg-danger p-2 rounded-circle" width="5" height="5"><span class="visually-hidden">No</span></span>
|
{% elif form.availability.available == 0%}
|
||||||
{% elif pos.player.availability.available == -1%}
|
<img class="bg-danger p-2 rounded-circle" width="5" height="5" id="player-available-{{ form.instance.player.id }}"><span class="visually-hidden">No</span></span>
|
||||||
<img class="bg-secondary p-2 rounded-circle" width="5" height="5"><span class="visually-hidden">Unknown</span></span>
|
{% elif form.availability.available == -1%}
|
||||||
|
<img class="bg-secondary p-2 rounded-circle" width="5" height="5" id="player-available-{{ form.instance.player.id }}"><span class="visually-hidden">Unknown</span></span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
<th><span class="d-none d-md-block" id="player-name-{{ form.instance.player.id }}">{{ form.instance.player.first_name }}</span> {{ form.instance.player.last_name }}</th>
|
<th>{{ form.instance.player.first_name }} {{ form.instance.player.last_name }} # {{ form.instance.player.jersey_number }}</th>
|
||||||
<td id="player-jersey-number-{{ form.instance.player.id }}">{{ form.instance.player.jersey_number }} </td>
|
<td id="player-position-{{ form.instance.player.id }}">{{ form.position }} </td>
|
||||||
<td id="player-statline-{{ form.instance.player.player.id }}"><code>{{ form.instance.player.statline}}</code></td>
|
{# <td id="player-statline-{{ form.instance.player.player.id }}"><code>{{ form.instance.player.statline}}</code></td>#}
|
||||||
</tr>
|
</tr>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table >
|
</table >
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<script src="https://raw.githack.com/SortableJS/Sortable/master/Sortable.js"></script>
|
<script src="https://raw.githack.com/SortableJS/Sortable/master/Sortable.js"></script>
|
||||||
<script id="sortable">
|
<script id="sortable">
|
||||||
|
function refresh_lineup_order (){
|
||||||
|
var player_rows = document.getElementById('lineup').querySelectorAll('tr')
|
||||||
|
for (let i = 0; i < player_rows.length; i++) {
|
||||||
|
player_rows[i].dataset.order = i + 1
|
||||||
|
var player_order = player_rows[i].querySelector('[id^="player-order"]')
|
||||||
|
var form_element_order = player_rows[i].querySelector('[id$="order"]')
|
||||||
|
player_order.innerText = parseInt(player_rows[i].dataset.order)
|
||||||
|
form_element_order.value = parseInt(player_rows[i].dataset.order)
|
||||||
|
}
|
||||||
|
}
|
||||||
var lineup = new Sortable.create(
|
var lineup = new Sortable.create(
|
||||||
document.getElementById('lineup'), {
|
document.getElementById('lineup'), {
|
||||||
animation: 150,
|
animation: 150,
|
||||||
@@ -95,11 +111,17 @@
|
|||||||
console.log('added to lineup')
|
console.log('added to lineup')
|
||||||
var itemEl = evt.item; // dragged HTMLElement
|
var itemEl = evt.item; // dragged HTMLElement
|
||||||
var player_id = itemEl.dataset.playerId
|
var player_id = itemEl.dataset.playerId
|
||||||
var statline = document.querySelector('#player-statline-'+player_id);
|
{#itemEl.order.set(99)#}
|
||||||
{#console.log(itemEl)#}
|
{#var statline = document.querySelector('#player-statline-'+player_id);#}
|
||||||
{#console.log(player_id)#}
|
console.log(itemEl)
|
||||||
{#console.log(statline)#}
|
var form_element_order =itemEl.querySelector('[id$="order"]')
|
||||||
statline.style.visibility='hidden'
|
var player_order = itemEl.querySelector('[id^="player-order"]')
|
||||||
|
var player_available =itemEl.querySelector('[id^="player-available"]')
|
||||||
|
refresh_lineup_order()
|
||||||
|
player_available.parentElement.style.display="none"
|
||||||
|
form_element_order.value = evt.newIndex + 1
|
||||||
|
player_order.innerHTML = evt.newIndex + 1
|
||||||
|
player_order.style.display="block"
|
||||||
evt.to; // target list
|
evt.to; // target list
|
||||||
evt.from; // previous list
|
evt.from; // previous list
|
||||||
evt.oldIndex; // element's old index within old parent
|
evt.oldIndex; // element's old index within old parent
|
||||||
@@ -111,6 +133,13 @@
|
|||||||
},
|
},
|
||||||
onUpdate: function (/**Event*/evt) {
|
onUpdate: function (/**Event*/evt) {
|
||||||
console.log('update to lineup')
|
console.log('update to lineup')
|
||||||
|
var itemEl = evt.item; // dragged HTMLElement
|
||||||
|
refresh_lineup_order()
|
||||||
|
|
||||||
|
{#player_available.parentElement.style.display="none"#}
|
||||||
|
{#form_element_order.value = evt.newIndex - 4#}
|
||||||
|
{#player_order.innerHTML = evt.newIndex - 4#}
|
||||||
|
{#player_order.style.display="block"#}
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
var bench = new Sortable.create(
|
var bench = new Sortable.create(
|
||||||
@@ -126,6 +155,13 @@
|
|||||||
console.log('added to bench')
|
console.log('added to bench')
|
||||||
var itemEl = evt.item; // dragged HTMLElement
|
var itemEl = evt.item; // dragged HTMLElement
|
||||||
console.log(itemEl)
|
console.log(itemEl)
|
||||||
|
var form_element_order =itemEl.querySelector('[id$="order"]')
|
||||||
|
var player_order = itemEl.querySelector('[id^="player-order"]')
|
||||||
|
var player_available =itemEl.querySelector('[id^="player-available"]')
|
||||||
|
player_available.parentElement.style.display="block"
|
||||||
|
form_element_order.value = evt.newIndex - 4
|
||||||
|
player_order.innerHTML = evt.newIndex - 4
|
||||||
|
player_order.style.display="none"
|
||||||
evt.to; // target list
|
evt.to; // target list
|
||||||
evt.from; // previous list
|
evt.from; // previous list
|
||||||
evt.oldIndex; // element's old index within old parent
|
evt.oldIndex; // element's old index within old parent
|
||||||
@@ -136,10 +172,11 @@
|
|||||||
evt.pullMode; // when item is in another sortable: `"clone"` if cloning, `true` if moving
|
evt.pullMode; // when item is in another sortable: `"clone"` if cloning, `true` if moving
|
||||||
var player_id = itemEl.dataset.playerId
|
var player_id = itemEl.dataset.playerId
|
||||||
var statline = document.querySelector('#player-statline-'+player_id);
|
var statline = document.querySelector('#player-statline-'+player_id);
|
||||||
|
refresh_lineup_order()
|
||||||
{#console.log(itemEl)#}
|
{#console.log(itemEl)#}
|
||||||
{#console.log(player_id)#}
|
{#console.log(player_id)#}
|
||||||
{#console.log(statline)#}
|
{#console.log(statline)#}
|
||||||
statline.style.visibility='visible'
|
{#statline.style.visibility='visible'#}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -44,16 +44,27 @@ def edit(request, event_id):
|
|||||||
players_without_positioning = [i for i in players if i not in players_with_positioning]
|
players_without_positioning = [i for i in players if i not in players_with_positioning]
|
||||||
Positioning.objects.bulk_create([Positioning(event_id=event_id, player=player) for player in players_without_positioning])
|
Positioning.objects.bulk_create([Positioning(event_id=event_id, player=player) for player in players_without_positioning])
|
||||||
qset = Positioning.objects.filter(event_id=event_id)
|
qset = Positioning.objects.filter(event_id=event_id)
|
||||||
formset = PositioningFormSet(queryset=qset)
|
for q in qset:
|
||||||
|
q.available= q.player.availability_set.get(player_id=q.player.id, event_id=event_id)
|
||||||
|
q.statline = q.player.statline_set.get(player_id=q.player.id)
|
||||||
|
formset = PositioningFormSet(queryset=qset.order_by('order'))
|
||||||
pass
|
pass
|
||||||
formset_starting = PositioningFormSet(
|
formset_starting = PositioningFormSet(
|
||||||
queryset=Positioning.objects.exclude(order__isnull=True).filter(event_id=event_id))
|
queryset=Positioning.objects.exclude(order__isnull=True).filter(event_id=event_id))
|
||||||
formset_bench = PositioningFormSet(
|
formset_bench = PositioningFormSet(
|
||||||
queryset=Positioning.objects.exclude(order__isnull=False).filter(event_id=event_id))
|
queryset=Positioning.objects.exclude(order__isnull=False).filter(event_id=event_id))
|
||||||
|
|
||||||
|
for f in formset:
|
||||||
|
if f.instance.player_id:
|
||||||
|
f.availability = f.instance.player.availability_set.get(event_id=event_id)
|
||||||
|
# f.statline = f.instance.player.statline_set.get()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return render(request, 'lineups/lineup.html', {'title': 'Lineup',
|
return render(request, 'lineups/lineup.html', {'title': 'Lineup',
|
||||||
'event': event,
|
'event': event,
|
||||||
'players_info': players_info,
|
'players_info': players_info,
|
||||||
|
'formset': formset,
|
||||||
# 'players': players_d,
|
# 'players': players_d,
|
||||||
# 'positionings_players_initial':[player for player in players if player['positioning']],
|
# 'positionings_players_initial':[player for player in players if player['positioning']],
|
||||||
'formset_starting':formset_starting,
|
'formset_starting':formset_starting,
|
||||||
|
|||||||
Reference in New Issue
Block a user